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.pngque tengo 2 archivos e file img.*informes uno png, el original sin tocar y uno nuevo JPEG. Por mogrifylo tanto , no sobrescribe los archivos originales en este caso.
mogrifyla documentación: " Esta herramienta es similar a convertexcepció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
donefinal para ese bucle. Además, para las cosas paralelas, podría evitar usar eso lsy 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 ejecutarse converten 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
-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).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:
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.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 alldirectorio, 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 readpieza (reemplácela o retírela por completo) ...
El png2jpgcomando " " real que está buscando se divide en realidad en dos comandos llamados pngtopnmy cjpeg, y son parte de los paquetes netpbmy libjpeg-progs, respectivamente.
png2pnm foo.png | cjpeg > foo.jpeg
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.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); done
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done. Eso evita los completamente innecesarios ls, grepy sedlas 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 lsson 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 findlos 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