其实挺好玩的 折腾一下午
刚开始用ffmpeg转的png 发现导不进去
然后命名成格式后能看到但是图像损坏
后来发现用GDI洗一遍就行
效果:

为什么呢?
PNG 的原生色彩空间是RGB,且没有二次采样的概念
用ffmpeg将png转为jpeg时,为了尽可能保真,ffmpeg默认会使用YUV4:4:4
老相机的硬件解码芯片为了节省会使用4:2:2或者4:2:0
GDI+因为老会砍一刀并强制使用非渐进式也就是基线式的jpg 并且丢弃现代标记等
# 1. 引入 Windows 底层图像处理库 (GDI+)
Add-Type -AssemblyName System.Drawing
# 2. 设置最基础的纯净 JPEG 编码器
$jpegCodec = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | Where-Object { $_.MimeType -eq 'image/jpeg' }
$encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1)
$encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter([System.Drawing.Imaging.Encoder]::Quality, 95L)
$n = 1
# 抓取当前目录下的所有 PNG 文件
foreach ($file in Get-ChildItem *.png) {
# 生成标准的相机文件名,如 DSC00001.JPG
$newName = "DSC0$($n.ToString('0000')).JPG"
$finalPath = Join-Path (Get-Location).Path $newName
Write-Host "转换: $($file.Name) -> $newName (保持原图尺寸)" -ForegroundColor Cyan
# 读取原图
$src = [System.Drawing.Image]::FromFile($file.FullName)
# 按照原图的真实宽高创建画布
$bmp = New-Object System.Drawing.Bitmap($src.Width, $src.Height)
$g = [System.Drawing.Graphics]::FromImage($bmp)
# 填充黑底(解决 PNG 透明背景问题)
$g.Clear([System.Drawing.Color]::Black)
# 1:1 原样绘制上去,不做任何缩放处理
$g.DrawImage($src, 0, 0, $src.Width, $src.Height)
# 保存为纯净的标准 JPEG
$bmp.Save($finalPath, $jpegCodec, $encoderParams)
# 释放内存,干干净净
$g.Dispose()
$bmp.Dispose()
$src.Dispose()
$n++
}
Write-Host "转换完毕" -ForegroundColor Green