You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:36:08