Cómo convertir 32 MB de un archivo PNG a 200 Kbs sin perder sus colores

Cómo convertir 32 MB de un archivo PNG a 200 Kbs sin perder sus colores

Tengo un par de imágenes que tienen un tamaño de 32 MB y quiero cambiar su tamaño de 32 MB a 100 Kbs o cualquier KB de tamaño sin afectar sus colores.

Los comandos que estoy probando son:

muhammad@muhammad-mohsin:~/scans$ find . -iname '*.png' -exec mogrify -format jpg "*.png" {} +


muhammad@muhammad-mohsin:~/$ find . -type f -iname \*.png -delete


muhammad@muhammad-mohsin:~/$ find . -iname '*.jpg' -exec mogrify -define jpeg:extent=300kb -strip -quality 90 -scale 90% *.jpg {} +

Aquí, primero convierto un PNG a JPG que reduce su tamaño de 32 Mbs a 5,8 Mbs y todo permanece igual, pero cuando uso el tercer comando, elimina el color de fondo de la imagen y la vuelve borrosa en escala de grises.

Sin embargo, el texto sigue siendo legible, pero los colores y el logotipo de fondo no.

¿Cómo puedo lograr esto con convert, mogrify o cualquier otra herramienta? Intenté todo lo posible hasta ahora.

Esto es parte de la imagen original.

Esto es parte de la imagen modificada después del comando.

Respuesta1

Es por cómo funciona la compresión JPEG. Intenta redondear los píxeles contiguos que son similares entre sí a valores similares. Esto provoca pérdida de detalles y formación de bloques.

Esto se vuelve más notorio a medida que aumenta el nivel de compresión, que esexactamenteque estas haciendo. Además lo estás haciendo en dos pasos:

  1. Compresión sin pérdida (PNG) a con pérdida (JPEG).
  2. Compresión con pérdida a pérdida.

Vas aprobablementeobtenga un mejor resultado pasando de sin pérdidas a con pérdidas en la calidad final, aplicando así sólo la compresión con pérdidas una vez, por ejemplo, usándola jpeg:extent=300kb -strip -quality 90 -scale 90%en la primera conversión.

Además, no dices nada sobre el tamaño de la imagen y el nivel de detalle. Puede que no sea factible reducirlo a 300 kB y conservar la calidad deseada.

Para deshacerse de las manchas de fondo, puede intentar aplicar umbrales a su documento en algún software de edición de imágenes, forzando que todo lo que esté por debajo de un cierto tono de gris sea blanco, por ejemplo.

Sin embargo, no importa lo que hagas, comprimir desde un formato sin pérdida de 30 MB a un formato con pérdida de 300 kBvoluntadconducir a una calidad visiblemente reducida.

Respuesta2

Lo estoy intentando find . -iname '*.png' -exec convert -resize 60% -quality 60 "*.jpg" {} +pero no funciona.

Árbitro.https://superuser.com/questions/71028/batch-converting-png-to-jpg-in-linux

$ ls -1 *.png | xargs -n 1 bash -c 'convert -quality 60 "$0" "${0%.*}.jpg"'

Convierte mi ejemplo 31MB.png a 1.4MB.jpg. ... Es posible que tengas que repetir con, por ejemplo, $ ls -1 *.PNG | ...etc.

Árbitro. comentario de @steeldriver: "un poco mejor es xargs -d '\n' -n 1"

información relacionada