2009-02-12 16 views
21

JPEG es un esquema de compresión con pérdida, por lo que descompresión-manipulación-recompresión normalmente reduce la calidad de la imagen aún más para cada paso. ¿Es posible rotar una imagen JPEG sin incurrir en mayores pérdidas? Por lo poco que sé del algoritmo JPEG, ingenuamente parece posible evitar pérdidas adicionales con un poco de esfuerzo. ¿Qué programas comunes de manipulación de imágenes (por ejemplo, GIMP, Paint Shop Pro, Windows Photo Gallery) y bibliotecas de gráficos causan pérdida de calidad al realizar una rotación y cuáles no?¿Se puede rotar una imagen JPEG comprimida sin pérdida de calidad?

Respuesta

6

Sí, es posible que en ciertos casos: rotaciones de 90 grados y vueltas en las imágenes con dimensiones que son un múltiplo de 8. El corazón del algoritmo JPEG - la parte con pérdida - implica romper la imagen en bloques de 8x8 píxeles, realizando un discrete cosine transform en el bloque y luego cuantificando el resultado. También hay un poco de conversión de espacio de color y compresión sin pérdida de los bloques en la parte superior.

Al girar o voltear un bloque de 8x8 se obtendrá un DCT con el mismos coeficientes básicos, pero posiblemente transpuestos y/o con algunos cambios de signo dependiendo de la transformación. Por lo tanto, los pasos básicos para girar o voltear una imagen sin pérdida implicarían:

  1. descomprimir y extraer los bloques
  2. transposición y/o señal de voltear los coeficientes DCT para cada bloque
  3. Reordenar los bloques en su nuevo orden (de lo contrario los bloques de 8x8 se pueden girar, pero todavía en el viejo lugar)
  4. Recomprimir todo con los pasos de compresión sin pérdida.
+2

¿Hay una biblioteca de Java que hace esto? –

9

Absolutamente: simplemente cambie el valor de orientación en los datos EXIF. La gran mayoría de los programas de imagen respetarán esta configuración y mostrarán la imagen "girada".

También es posible rotar la imagen "manualmente" (por ejemplo, mediante programación) sin pérdidas si ciertos criterios son ciertos: la rotación debe ser de 90/180 grados y el ancho/alto debe ser múltiplo del tamaño del bloque. También puede voltear/duplicarlo. Sin embargo, no sé si los programas de imagen son lo suficientemente inteligentes como para casos especiales de esta operación. Yo diría que no.

+0

Puede hacer una transformación sin pérdidas 90-180-270 "manual" con jpeg. – xpda

+1

cambiar el Exif de la imagen no hará nada con los datos, y algunos lectores de imágenes no lo tratan bien.además, es un poco más difícil de jugar en caso de que desee modificar la imagen, ya que debe tener en cuenta la orientación ... –

2

No es un experto en jpg, pero parece que la respuesta sería Sí para 90, 180, 270 grados de rotación. (¡quizás incluso para 360! :))

+4

360 es factible, pero 720 requiere más habilidad – Javier

+1

¡Difícilmente! Solo haz 360 dos veces. –

+2

@ Assaf, ¿qué hay de 1080? – Aardvark

2

Sí, es posible.
Una rápida búsqueda en Google dio esta lista de programas which do this

+0

¿Conoces alguna biblioteca que lo haga? –

0

Si se trata de una imagen JPEG de rotación, entonces no hay más a la derecha de compresión? Se trata de rotar ubicaciones de píxeles.

Hacer la rotación con cualquier programa potencialmente cambiará las dimensiones intermedias, ya que necesita preservar la imagen original, esto puede ser un problema a considerar.

0

A menos que gire en múltiplos de 90 grados, la imagen tendrá que realizar algún tipo de interpolación que podría reducir la calidad de la imagen. Usar un buen algoritmo de interpolación ayudará aquí.

En cuanto a abrir y volver a comprimir, no estoy seguro de que realmente obtendría peor calidad, pero entonces no estoy seguro exactamente cómo funciona JPEG.

Te sugiero que intentes comprimir, manipular y recomprimir y ver por ti mismo si el resultado es lo suficientemente bueno. Lo que es bueno está sujeto a su aplicación.

+1

La apertura y recompresión, especialmente varias veces, definitivamente daría como resultado una peor calidad. Esta es una debilidad fundamental de la compresión sin pérdidas. (Si es lo suficientemente peor como para preocuparse es definitivamente subjetivo como usted sugiere). –

8

Desde el JPEG FAQ:

"Hay algunas especializados operaciones que se pueden realizar en un archivo JPEG sin descomprimir, y por lo tanto sin incurrir en la pérdida generacional que es bastante normal obtener de cargar y volver a guardar la imagen en un editor de imágenes normal. En en particular, es posible hacer giros de 90 grados y voltea sin pérdidas, si la imagen tiene dimensiones son un múltiplo del tamaño del bloque del archivo (típicamente 16x16, 16x8 o 8x8 píxeles para archivos JPEG en color).
...

Pero usted necesita un software especial; rotar la imagen en un editor de imágenes regular no será sin pérdida."

13

Hay un programa llamado jpegtran

jpegtran - una utilidad para la transcodificación sin pérdidas entre diferentes formatos JPEG.

Y Here is a list of applications which provide the JPEG lossless rotation feature based on the IJG code

+0

Nota: el paquete correspondiente se llama 'libjpeg-turbo' en ArchLinux. – VasyaNovikov

+0

ADVERTENCIA: También descubrí que jpegtran _can de hecho_ puede perder calidad. Probablemente le suceda a jpeg qué tamaño no se puede dividir entre 16. Comentarios de gente conocedora bienvenida. – VasyaNovikov

1

De acuerdo con el artículo excelente sobre Understanding Digital Image Interpolation por Sean McHugh:

interpolación también se produce cada vez que se gira o distorsionar una imagen. (...) La rotación de 90 ° no tiene pérdidas porque ningún píxel debe volver a colocarse en el borde entre dos píxeles (y por lo tanto dividido).

y finalmente concluye con

evitar la rotación de sus fotos cuando sea posible; si una foto no nivelada lo requiere, gire no más de una vez.

0

Si puede ayudar:

Tratar de hacerlo mejor que el visor de imágenes nativo de Microsoft (Windows 7) y sus opciones de rotación del botón derecho, he intentado varias aplicaciones del siguiente enlace: http://jpegclub.org/losslessapps.html

Por ejemplo, probé FastStone Image Viewer, XnView, Photosurfer, JPEG Lossless Rotator, ExifPro Image Viewer.

NINGUNO de ellos produce una imagen más grande que el visor de imágenes de Windows 7 básico después de una simple rotación de 90 °. Es cierto que se limita a concluir tan rápido, pero todavía no he encontrado una aplicación .jpeg de rotación sin pérdida real por el momento, y en cualquier caso, no es mejor que la incorporada en Windows.

Cuestiones relacionadas