Windows 10下用VBA/PowerShell提取JPEG的Compression属性排查伪文件
批量提取JPEG文件压缩属性的解决方案
一、PowerShell 实现方案
通过.NET的System.Drawing组件读取图像内部的EXIF压缩属性,直接判断文件是否为真正的JPEG压缩格式,适合批量处理数千个文件:
# 设置目标文件夹路径 $targetFolder = "C:\Your\Image\Folder" # 获取所有JPG/JPEG文件(包含大小写扩展名) $jpegFiles = Get-ChildItem -Path $targetFolder -Filter *.jpg -Recurse -File $jpegFiles += Get-ChildItem -Path $targetFolder -Filter *.jpeg -Recurse -File # 初始化结果数组 $results = @() foreach ($file in $jpegFiles) { try { # 加载图像并释放资源 $image = [System.Drawing.Image]::FromFile($file.FullName) # 定位压缩属性(EXIF标签ID 0x0103) $compressionValue = ($image.PropertyItems | Where-Object { $_.Id -eq 0x0103 }).Value[0] # 转换为可读文本 $compressionText = switch ($compressionValue) { 0 { "Uncompressed" } 6 { "JPEG Compression" } default { "Unknown" } } # 记录结果 $results += [PSCustomObject]@{ FilePath = $file.FullName FileName = $file.Name Compression = $compressionText IsValidJPEG = $compressionText -eq "JPEG Compression" } $image.Dispose() } catch { # 捕获无法加载的异常文件 $results += [PSCustomObject]@{ FilePath = $file.FullName FileName = $file.Name Compression = "加载失败" IsValidJPEG = $false } } } # 导出结果到CSV $results | Export-Csv -Path "$targetFolder\JPEG_Compression_Check.csv" -NoTypeInformation -Encoding UTF8 Write-Host "检测完成,结果已保存到 JPEG_Compression_Check.csv"
执行说明:
- 替换
$targetFolder为你的图像文件夹路径 - 运行后会生成CSV文件,直接筛选
Compression列为Uncompressed的条目即可找到假JPEG文件 - Windows系统默认包含
System.Drawing组件,无需额外安装
二、Excel VBA 实现方案
利用Windows WIA组件读取图像内部属性,适合在Excel中直接处理并展示结果:
Sub CheckJPEGCompression() Dim targetFolder As String Dim fileSys As Object, folderObj As Object, fileObj As Object Dim wiaImg As Object, prop As Object Dim compression As String Dim rowNum As Integer ' 设置目标文件夹 targetFolder = "C:\Your\Image\Folder" Set fileSys = CreateObject("Scripting.FileSystemObject") Set folderObj = fileSys.GetFolder(targetFolder) ' 初始化表头 Cells(1, 1) = "文件名" Cells(1, 2) = "文件路径" Cells(1, 3) = "压缩属性" Cells(1, 4) = "是否为有效JPEG" rowNum = 2 ' 遍历所有JPG/JPEG文件 For Each fileObj In folderObj.Files If LCase(fileSys.GetExtensionName(fileObj.Name)) Like "jpg" Or _ LCase(fileSys.GetExtensionName(fileObj.Name)) Like "jpeg" Then On Error Resume Next Set wiaImg = CreateObject("WIA.ImageFile") wiaImg.LoadFile fileObj.Path ' 查找压缩属性(PropertyID 259对应EXIF标签0x0103) compression = "Unknown" For Each prop In wiaImg.Properties If prop.PropertyID = 259 Then Select Case prop.Value Case 0: compression = "Uncompressed" Case 6: compression = "JPEG Compression" End Select Exit For End If Next prop ' 写入表格 Cells(rowNum, 1) = fileObj.Name Cells(rowNum, 2) = fileObj.Path Cells(rowNum, 3) = compression Cells(rowNum, 4) = IIf(compression = "JPEG Compression", "是", "否") rowNum = rowNum + 1 Set wiaImg = Nothing On Error GoTo 0 End If Next fileObj ' 自动调整列宽 Columns("A:D").AutoFit MsgBox "检测完成!" End Sub
执行说明:
- 替换
targetFolder为你的图像文件夹路径 - 若提示WIA组件未注册,可运行命令
regsvr32 wiaaut.dll(以管理员身份)注册组件
三、快速工具方案(ExifTool)
无需编写代码,用专业图像元数据工具ExifTool批量提取:
- 下载ExifTool并将其放入图像文件夹或系统PATH
- 打开命令提示符,进入目标文件夹后执行:
exiftool -r -csv -Compression -FileName -Directory . > JPEG_Compression_Check.csv
- 打开生成的CSV文件,筛选
Compression列为Uncompressed的条目即可找到问题文件
内容的提问来源于stack exchange,提问作者MBB70
相关产品推荐
相关产品推荐

