¿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 *.png
mogrify -format jpeg img.png
que tengo 2 archivos efile img.*
informes uno png, el original sin tocar y uno nuevo JPEG. Pormogrify
lo tanto , no sobrescribe los archivos originales en este caso.mogrify
la documentación: " Esta herramienta es similar aconvert
excepció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
done
final para ese bucle. Además, para las cosas paralelas, podría evitar usar esols
y canalizar con una construcción como:parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(ver aquí )ls
mé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
convert
comando que se encuentra en muchas distribuciones de Linux se instala como parte de la suite ImageMagick. Aquí está el código bash para ejecutarseconvert
en 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}"; done
tl; 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
-format
opció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)
)- format
opción especifica que va a cambiar el formato, y el siguiente argumento debe ser el tipo (en este caso, jpg).*.png
son 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:0
significa 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.rm
comando 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
all
directorio, numerelos , elimine los archivos png originales y muestre la salida de cada archivo a medida que se realiza:fuente
while read
pieza (reemplácela o retírela por completo) ...El
png2jpg
comando " " real que está buscando se divide en realidad en dos comandos llamadospngtopnm
ycjpeg
, y son parte de los paquetesnetpbm
ylibjpeg-progs
, respectivamente.fuente
fuente
*.jpg
archivos resultantes al lado de los*.png
archivos 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); done
fuente
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Eso evita los completamente innecesariosls
,grep
ysed
las 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 versionesls
son 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
find
los 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