如何修改PowerShell脚本以仅转换PowerPoint中大于100KB的嵌入PNG为JPEG
如何修改PowerShell脚本以仅转换PowerPoint中大于100KB的嵌入PNG为JPEG
没问题,我来帮你调整这个PowerShell脚本,让它只针对大于100KB的嵌入PNG图片进行JPEG转换,这样那些小尺寸带透明背景的PNG就不会被处理,避免出现背景变黑的问题,同时还能保留原有的压缩大文件的效果。
以下是修改后的完整脚本,我会在后面标注关键的改动点:
# 加载PowerPoint COM对象 $powerPoint = New-Object -ComObject PowerPoint.Application $powerPoint.Visible = [Microsoft.Office.Core.MsoTriState]::msoFalse # 替换为你的PPT文件路径 $pptPath = "C:\Your\Presentation.pptx" $presentation = $powerPoint.Presentations.Open($pptPath) # 遍历所有幻灯片 foreach ($slide in $presentation.Slides) { # 遍历幻灯片中的所有形状 foreach ($shape in $slide.Shapes) { # 检查是否是图片且格式为PNG if ($shape.Type -eq [Microsoft.Office.Core.MsoShapeType]::msoPicture -and $shape.PictureFormat.Type -eq [Microsoft.Office.Core.MsoPictureType]::msoPicturePNG) { # 获取图片的字节数据来判断大小 $imageBytes = $shape.PictureFormat.Picture.Data # 判断是否大于100KB(100 * 1024 = 102400字节) if ($imageBytes.Length -gt 102400) { # 临时保存PNG到临时文件 $tempPngPath = [System.IO.Path]::GetTempFileName() + ".png" $shape.PictureFormat.Picture.Save($tempPngPath) # 将PNG转换为JPEG并替换原图片 $jpeg = New-Object -ComObject WIA.ImageFile $jpeg.LoadFile($tempPngPath) $tempJpgPath = [System.IO.Path]::GetTempFileName() + ".jpg" $jpeg.SaveFile($tempJpgPath) $shape.Fill.UserPicture($tempJpgPath) # 清理临时文件 Remove-Item $tempPngPath, $tempJpgPath -Force } } } } # 保存修改后的PPT(可以另存为新文件避免覆盖原文件) $presentation.SaveAs("C:\Your\Compressed_Presentation.pptx") $presentation.Close() $powerPoint.Quit() # 释放COM对象 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($powerPoint) | Out-Null
关键改动说明:
- 添加了
$imageBytes = $shape.PictureFormat.Picture.Data来获取嵌入PNG的字节数据,通过$imageBytes.Length得到图片的字节大小。 - 增加了判断条件
if ($imageBytes.Length -gt 102400),这里的102400字节等于100KB,只有满足这个条件的PNG才会被转换为JPEG。 - 保留了原脚本的核心转换逻辑,只针对大尺寸PNG执行转换,小透明PNG会被跳过。
注意事项:
- 运行脚本前请确保关闭目标PPT文件,避免权限冲突。
- 脚本需要依赖WIA(Windows Image Acquisition)组件,一般Windows系统默认已安装,如果遇到错误可以检查该组件是否正常。
- 建议先在测试PPT上运行脚本,确认效果后再处理正式文件,也可以修改
SaveAs的路径来另存为新文件,避免覆盖原文件。
备注:内容来源于stack exchange,提问作者AKV




