¿Cómo convertir varios archivos PNG incrustados a JPEG en un archivo de Powerpoint?

6

Tengo un archivo de PowerPoint grande con muchas imágenes incrustadas, algunas de las cuales son JPEG y algunas PNG. Para que el archivo sea lo más pequeño posible, me gustaría que todas las imágenes PNG se convirtieran a JPEG.

Esto se puede hacer guardando manualmente cada imagen, convirtiéndola y volviéndola a agregar a la presentación, pero lleva mucho tiempo. ¿Existe alguna funcionalidad para realizar una conversión por lotes en MS Powerpoint (2016) o algún otro método para lograr esto de manera más eficiente?


Agregado: Me doy cuenta de que las imágenes se pueden comprimir en PowerPoint, y ya lo he hecho. Pero eso no reduce tanto el tamaño del archivo como la sustitución de los archivos PNG por archivos JPEG, ya que los archivos PNG son archivos mucho más grandes, de ahí la pregunta.

Harry Vervet
fuente

Respuestas:

4

¡Puedes usar PowerShell! Dado que los documentos de Office modernos son en realidad archivos ZIP que contienen principalmente archivos XML, podemos manipularlos con bastante facilidad sin depender de ningún componente de Office. Escribí este guión para ti:

[CmdletBinding()]
Param(
    [Parameter(Mandatory = $true)][string]$File,
    [Parameter()][int]$Quality = 50
)
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.Drawing
$fs = New-Object System.IO.FileStream (Resolve-Path $File), 'Open'
$zip = New-Object System.IO.Compression.ZipArchive $fs, 'Update'
$zip.Entries | ? {$_.FullName -like 'ppt/media/*.png'} | % {
    $s = $_.Open()
    $img = [System.Drawing.Image]::FromStream($s)
    $s.Position = 0
    $codec = [System.Drawing.Imaging.ImageCodecInfo]::GetImageDecoders() | ? {$_.FormatId -eq [System.Drawing.Imaging.ImageFormat]::Jpeg.Guid}
    $qualityprop = [System.Drawing.Imaging.Encoder]::Quality
    $encodeparams = New-Object System.Drawing.Imaging.EncoderParameters 1
    $encodeparams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter $qualityprop, $Quality
    $img.Save($s, $codec, $encodeparams)
    $s.SetLength($s.Position)
    $s.Close()
}
$zip.Dispose()

Abre el archivo PPTX dado como un archivo ZIP, encuentra cada imagen PNG incrustada y convierte esa imagen en un JPG. No actualiza la extensión del archivo dentro del archivo, pero parece que a PowerPoint no le importa (probado en PowerPoint 2016 en Windows 10). Si desea que intente trabajar con todos los tipos de imágenes (no he probado otros formatos), cambie esta línea:

$zip.Entries | ? {$_.FullName -like 'ppt/media/*.png'} | % {

A esto:

$zip.Entries | ? {$_.FullName.StartsWith('ppt/media/')} | % {

Guarde el script como .ps1 archivo, por ejemplo pptxjpg.ps1. Si aún no lo ha hecho, siga las instrucciones en la sección Habilitación de scripts de la etiqueta de PowerShell wiki . Luego puedes ejecutarlo desde un indicador de PowerShell como este:

.\pptxjpg.ps1 C:\path\to\presentation.pptx

Toma un parámetro opcional que especifica la calidad de JPG, el valor predeterminado es 50. Si desea ahorrar aún más espacio, puede especificar un valor más bajo, como:

.\pptxjpg.ps1 C:\path\to\presentation.pptx -Quality 20

Cuando probé este último comando, redujo el tamaño de una presentación que contiene una captura de pantalla de alta resolución y un diagrama de tamaño mediano de 982 KB a 253 KB.

Ben N
fuente
2

Si desea minimizar el archivo pptx, independientemente de la configuración de los formatos de imagen, seleccione una imagen y, en el menú Cinta, seleccione Format y encuentra el botón Compress Pictures. Desmarcar Apply only to this picture para aplicar a todas las imágenes.

Opcional: coloque el botón de radio en E-mail 96 ppi. Eso bajará la resolución y creará un pptx más ligero. garrapata Delete cropped areas of pictures para descartar las porciones no utilizadas ocultas con el botón Recortar.

Sanny
fuente
2
Sé que puedes comprimir las imágenes, pero eso no es lo que estoy preguntando. Además, el uso de este método solo parece comprimir todas las imágenes de un tipo de archivo dado (es decir, parece que solo comprime los JPEG a menos que vaya y repita el proceso en un PNG). Las imágenes PNG siguen siendo mucho más grandes que las JPEG, por lo que quiero reemplazar todas las PNG con versiones JPEG como se indica en la pregunta.
Harry Vervet
Primero, este método comprime todas las imágenes, no como piensas. Aquí ( i.imgur.com/GF9S9FA.png ) Realicé la compresión seleccionando una imagen JPEG, el proceso fue junto con la imagen PNG también. Sin embargo, incluso si logra convertir PNG a JPEG, terminará rompiendo el enlace que solicita volver a insertar las imágenes recién convertidas. Recuerde, PNG (sin pérdida) siempre será mucho más grande que JPEG (compresión con pérdida). Si esta respuesta no te satisface, la eliminaré.
Sanny
2
Este método comprime la imagen reduciendo la resolución y recortando el área oculta. El formato de la imagen está reservado, por lo que, independientemente del formato original, se conserva.
Yvon