PowerShell实现图片PropertyItems字节数组转字符串及ID转命名值
图片PropertyItems属性读取问题解答
原有代码存在的问题
- 语法误用:在
[System.Text.Encoding]::ASCII.GetString()方法中错误使用了仅适用于Select-Object的-ExpandProperty参数,该方法仅接受字节数组作为直接输入。 - 管道断裂:更新后的代码中
Select-Object处理完的结果没有通过管道传递给后续的ForEach-Object,导致循环逻辑完全不会执行。 - 转码逻辑错误:将已经通过ASCII转码得到的字符串
$_.V二次传入其他编码的GetString方法,该方法要求输入必须是原始的字节数组$_.Value,二次转码只会得到乱码。 - 类型处理逻辑错误:不同Type的属性值存储格式不同,比如数字、分数类型的属性不能直接用文本编码转成字符串,需要先转换成对应的数据类型再输出。
修正后的完整代码
# 加载System.Drawing程序集 Add-Type -AssemblyName System.Drawing # 预定义常见EXIF属性ID和名称的映射表,可自行补充 $exifIdMap = @{ 271 = "制造商" 272 = "相机型号" 274 = "旋转方向" 305 = "软件版本" 306 = "拍摄时间" 33432 = "版权信息" 36867 = "原始拍摄时间" 36868 = "数字化时间" } $imgPath = 'C:\temp\Chart01.jpg' $img = [System.Drawing.Image]::FromFile($imgPath) $img.PropertyItems | Sort-Object Id | ForEach-Object { $id = $_.Id $type = $_.Type $valueBytes = $_.Value $propName = $exifIdMap[$id] ?? "未知属性($id)" $parsedValue = switch ($type) { 1 { # 字节数组,直接输出十六进制字符串 [BitConverter]::ToString($valueBytes) } 2 { # ASCII字符串,自动截断末尾的空字符 [System.Text.Encoding]::ASCII.GetString($valueBytes).TrimEnd("`0") } 3 { # 16位无符号整数数组 [System.BitConverter]::ToUInt16($valueBytes, 0) } 4 { # 32位无符号整数数组 [System.BitConverter]::ToUInt32($valueBytes, 0) } 5 { # 无符号分数,前4字节分子,后4字节分母 $numerator = [System.BitConverter]::ToUInt32($valueBytes, 0) $denominator = [System.BitConverter]::ToUInt32($valueBytes, 4) if ($denominator -ne 0) { "$numerator/$denominator = $([math]::Round($numerator/$denominator, 4))" } else { "$numerator/0" } } 7 { # 32位有符号整数数组 [System.BitConverter]::ToInt32($valueBytes, 0) } 10 { # 有符号分数,前4字节分子,后4字节分母 $numerator = [System.BitConverter]::ToInt32($valueBytes, 0) $denominator = [System.BitConverter]::ToInt32($valueBytes, 4) if ($denominator -ne 0) { "$numerator/$denominator = $([math]::Round($numerator/$denominator, 4))" } else { "$numerator/0" } } default { "不支持的类型($type)" } } Write-Host "属性名称:$propName,ID:$id,类型:$type,解析值:$parsedValue" } # 释放图片资源 $img.Dispose()
数字ID转命名实现说明
通过预定义EXIF属性ID和对应名称的哈希映射表即可实现转换,上述代码中已经包含了常见属性的映射,你可以根据需要自行补充其他ID的对应名称。
内容的提问来源于stack exchange,提问作者Still Learning
相关产品推荐
相关产品推荐

