¿Alguien sabe una buena manera de convertir por lotes un montón de PNG en JPG en Linux? (Estoy usando Ubuntu).
Un binario png2jpg que podría colocar en un script de shell sería ideal.
                    
                        linux
                                shell-script
                                jpeg
                                png
                                
                    
                    
                        nedned
fuente
                
                
            fuente

mogrify -format jpg -background black -flatten *.pngmogrify -format jpeg img.pngque tengo 2 archivos efile img.*informes uno png, el original sin tocar y uno nuevo JPEG. Pormogrifylo tanto , no sobrescribe los archivos originales en este caso.mogrifyla documentación: " Esta herramienta es similar aconvertexcepción de que el archivo de imagen original se sobrescribe (a menos que cambie el sufijo archivo con el -format opción) con los cambios solicitados. "Tengo un par de soluciones más.
La solución más simple es como la mayoría ya publicada. Una simple bash para bucle.
Por alguna razón, tiendo a evitar los bucles en bash, así que aquí hay un enfoque xargs más unixy, usando bash para el cambio de nombre.
El que yo uso. Utiliza GNU Parallel para ejecutar múltiples trabajos a la vez, lo que le brinda un aumento de rendimiento. Se instala por defecto en muchos sistemas y está casi definitivamente en su repositorio (es un buen programa para tener).
El número de trabajos predeterminado es el número de procesos que tiene. Encontré un mejor uso de la CPU usando 3 trabajos en mi sistema de doble núcleo.
Y si desea algunas estadísticas (una ETA, trabajos completados, tiempo promedio por trabajo ...)
También hay una sintaxis alternativa si está utilizando GNU Parallel.
Y una sintaxis similar para algunas otras versiones (incluida debian).
fuente
donefinal para ese bucle. Además, para las cosas paralelas, podría evitar usar esolsy canalizar con una construcción como:parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png(ver aquí )lsmétodo porque tiene más sentido para mí.--lugar de:::), e incluso entonces, carece frustrantemente de algunas de las características del paralelo GNU.El
convertcomando que se encuentra en muchas distribuciones de Linux se instala como parte de la suite ImageMagick. Aquí está el código bash para ejecutarseconverten todos los archivos PNG en un directorio y evitar ese problema de doble extensión:fuente
for f in *.png; do convert "$f" "${f/%png/jpg}"; donetl; dr
Para aquellos que solo quieren los comandos más simples:
Convierte y guarda archivos originales:
Convierte y elimina archivos originales:
Conversión por lotes explicada
Un poco tarde para la fiesta, pero solo para aclarar toda la confusión para alguien que puede no estar muy cómodo con cli, aquí hay una referencia y explicación súper tonta.
Directorio de ejemplo
Conversión simple
Mantiene todos los archivos png originales y crea archivos jpg.
Resultado
Explicación
-formatopción. (Desde el sitio :This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option))- formatopción especifica que va a cambiar el formato, y el siguiente argumento debe ser el tipo (en este caso, jpg).*.pngson los archivos de entrada (todos los archivos que terminan en .png).Convertir y quitar
Convierte todos los archivos png a jpg, elimina el original.
Resultado
Explicación
&&es un operador booleano. En breve:0significa sin errores.&&realiza una evaluación de cortocircuito , la parte correcta solo se realizará si no hubo errores . Esto es útil porque es posible que no desee eliminar todos los archivos originales si hubo un error al convertirlos.rmcomando elimina archivos.Cosas lujosas
Ahora aquí hay algunas golosinas para las personas que se sienten cómodas con el cli.
Si quieres algo de salida mientras está convirtiendo archivos:
Convierta todos los archivos png en todos los subdirectorios y dé salida para cada uno:
Convierta todos los archivos png en todos los subdirectorios, coloque todos los jpgs resultantes en el
alldirectorio, numerelos , elimine los archivos png originales y muestre la salida de cada archivo a medida que se realiza:fuente
while readpieza (reemplácela o retírela por completo) ...El
png2jpgcomando " " real que está buscando se divide en realidad en dos comandos llamadospngtopnmycjpeg, y son parte de los paquetesnetpbmylibjpeg-progs, respectivamente.fuente
fuente
*.jpgarchivos resultantes al lado de los*.pngarchivos originales , muestra cómo reducir el tamaño / calidad del archivo y no se rompe debido a los caracteres extraños en el directorio o el nombre del archivo.mi solucion rapida
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); donefuente
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done. Eso evita los completamente innecesariosls,grepysedlas llamadas (yecho, pero IIRC que es una fiesta de orden interna y por lo tanto no tendrá ningún / muy poco impacto en el rendimiento), y se deshace de dos tubos y dos subniveles, y cuenta con menores a escribir. Es incluso un poco más portátil, ya que no todas las versioneslsson seguras de analizar.Muchos años demasiado tarde, hay una utilidad png2jpeg específicamente para este propósito, que escribí .
Adaptando el código por @Marcin:
fuente
Para procesamiento por lotes:
Sin embargo, terminarás con nombres de archivo como image1.png.jpg.
Esto funcionará en bash, y quizás en bourne. No sé sobre otros shells, pero la única diferencia probablemente sería la sintaxis del bucle.
fuente
Esto es lo que uso para convertir cuando los archivos abarcan más de un directorio. Mi original era TGA a PNG
El concepto es que tienes
findlos archivos que necesitas, quita la extensión y luego vuelve a agregarlaxargs. Entonces, para PNG a JPG, cambiaría las extensiones y haría una cosa adicional para lidiar con los canales alfa, a saber, establecer el fondo (en este ejemplo blanco, pero puede cambiarlo) y luego aplanar la imagenfuente