Respuestas:
Su mejor opción sería usar Imagemagick
No soy un experto en el uso real, ¡pero sé que puedes hacer casi cualquier imagen relacionada con esto!
Un ejemplo es:
convert image.png image.jpg
y mantendrá el original y creará la imagen convertida. En cuanto a lote. Creo que necesitas usar la herramienta Mogrify (desde la misma línea de comando cuando estás en imagemagick). Tenga en cuenta que esto sobrescribe las imágenes antiguas.
El comando es:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
que tengo 2 archivos e file img.*
informes uno png, el original sin tocar y uno nuevo JPEG. Por mogrify
lo tanto , no sobrescribe los archivos originales en este caso.
mogrify
la documentación: " Esta herramienta es similar a convert
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.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
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.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
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).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
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.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
Y si desea algunas estadísticas (una ETA, trabajos completados, tiempo promedio por trabajo ...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
También hay una sintaxis alternativa si está utilizando GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
Y una sintaxis similar para algunas otras versiones (incluida debian).
parallel convert '{}' '{.}.jpg' -- *.png
done
final para ese bucle. Además, para las cosas paralelas, podría evitar usar eso ls
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 ejecutarse convert
en todos los archivos PNG en un directorio y evitar ese problema de doble extensión:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
Para aquellos que solo quieren los comandos más simples:
Convierte y guarda archivos originales:
mogrify -format jpg *.png
Convierte y elimina archivos originales:
mogrify -format jpg *.png && rm *.png
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
bar.png
foo.png
foobar.jpg
Mantiene todos los archivos png originales y crea archivos jpg.
mogrify -format jpg *.png
Resultado
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
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).Convierte todos los archivos png a jpg, elimina el original.
mogrify -format jpg *.png && rm *.png
Resultado
bar.jpg
foo.jpg
foobar.jpg
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.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:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Convierta todos los archivos png en todos los subdirectorios y dé salida para cada uno:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
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:
n=0; find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; fn="all/$((n++)).jpg"; mv "${i%.*}.jpg" "$fn"; echo "Moved $i to $fn"; done
while read
pieza (reemplácela o retírela por completo) ...
El png2jpg
comando " " real que está buscando se divide en realidad en dos comandos llamados pngtopnm
y cjpeg
, y son parte de los paquetes netpbm
y libjpeg-progs
, respectivamente.
png2pnm foo.png | cjpeg > foo.jpeg
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.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
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Eso evita los completamente innecesarios ls
, grep
y sed
las llamadas (y echo
, 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 versiones ls
son seguras de analizar.
Para procesamiento por lotes:
for img in *.png; do
convert "$img" "$img.jpg"
done
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.
Esto es lo que uso para convertir cuando los archivos abarcan más de un directorio. Mi original era TGA a PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
El concepto es que tienes find
los archivos que necesitas, quita la extensión y luego vuelve a agregarla xargs
. 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 imagen
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg