
Digamos que tengo una versión sin pérdidas de una imagen que está previamente comprimida en formato JPEG (por ejemplo, si abres una imagen JPEG en mspaint y la guardas como BMP, sé que algunos metadatos se perderán en este proceso, pero eso no es de mi incumbencia).
Me gustaría saber si es posible y cómo convertirlo nuevamente al formato JPEG sin perder calidad de imagen, es decir, que cada píxel sea exactamente igual.
EDITAR:Entiendo perfectamente que convertir una imagen JPEG a un formato sin pérdidas no me dará ninguna calidad adicional. Pregunto esto porque: Tengo un archivo PNG extraído de un archivo SWF. Originalmente (en el archivo SWF) el objeto era una imagen JPEG + canal alfa, cuyo tamaño de archivo es mucho más pequeño en comparación con el archivo PNG que tengo. Quiero el formato original (JPEG + canal alfa), pero ya no tengo copias del archivo SWF original (y tampoco pude encontrar ninguna en línea), por lo que no puedo rehacer el proceso de extracción.
Respuesta1
Básicamente, lo que pregunta es si el proceso de decodificación de una imagen JPEG se puede revertir. Esta es una intención muy diferente a la de un codificador JPEG convencional, yNo conozco ningún software que logre esto.Matemáticamente esto es posible* siempre y cuando a la imagen no se le haya aplicado una transformación u otra modificación después de ser codificada, pero desde el punto de vista programático, ¿qué tan difícil podría ser?
El primer problema es el espacio de color: JPEG utiliza yCbCr submuestreado (el color muestreado en un grupo de píxeles), mientras que un mapa de bits es RGB. Las pérdidas inevitables al convertir entre estos espacios de color (y también en cualquier ajuste de gamma) introducen ruido. El segundo problema a resolver es que JPEG registra los datos de la imagen como macrobloques (subimágenes de tamaño NxN), que deben inferirse de la imagen de salida del decodificador. Puede encontrar una explicación más detallada del formato JPEG y el proceso de codificación aquí.http://www.guillermito2.net/stegano/jsteg/
'descodificar' un JPEG:
Para crear una aproximación de los datos JPEG originales, necesitamos encontrar el submuestreo, el tamaño y la alineación de los macrobloques y los coeficientes de transformada de coseno discreta (DCT) que se utilizaron para codificarlos. El resto es idéntico a un proceso de codificación JPEG normal. Una implementación ingenua que me viene a la mente es "conjetura y comprobación fundamentada": suponga que se utilizaron algunas implementaciones JPEG comunes para crear la imagen e intente aplicarlas hasta que encuentre una que tenga resultados 'similares a JPEG' del DCT (normalmente ceros para altas frecuencias).
Después de eso, ajuste los coeficientes para lograr un error mínimo en comparación con el original (es decir, el mapa de bits de la imagen comprimida). Este proceso seguirá dando como resultado un equilibrio entre error y tamaño de archivo, pero debería acercarse lo suficiente para fines prácticos.
Fuente: Empleo anterior verificando códecs de video DNx y ProRes, que aplican codificación similar a JPEG a cada cuadro individual (el software para revertir cuadros decodificados habría sido un proyecto paralelo muy interesante y potencialmente útil).
* Existe un conjunto de datos de entrada que producirá una salida idéntica cuando pase por el decodificador JPEG original; sin embargo, es muy improbable que cualquier reconstrucción sea una copia byte a byte (ignorando los metadatos) del archivo original porque la información se perdió durante la decodificación. proceso.
Respuesta2
JPEG es un formato con pérdida y no hay forma de evitarlo. Incluso con una calidad de compresión de 100, la relación de compresión sigue siendo 2,6:1 (WikipediaJPEG).
Se propusieron algunas variantes paraJPEG sin pérdida, como JPEG 2000, pero no han tenido éxito y su soporte es muy deficiente.
Sería mejor convertir a un formato sin pérdidas, como PNG, que todavía se comprime pero sin pérdida.
Respuesta3
Si abre una imagen JPEG con cualquier editor y la guarda como BMP, no obtendrá más calidad que la que ya está disponible en su .jpg
archivo. Sería como convertir un archivo mp3 de baja tasa de bits (por ejemplo, 128 kbps) a un formato mucho mejor como flac
, con la esperanza de que de alguna manera la calidad se restaure mágicamente. No lo hará.
La información se perdió cuando guardó la imagen por primera vez en jpg, como dijo harrymc; no hay forma de recuperar esa información de este archivo jpg.
La compresión con pérdida es "destructiva" o también conocida como "irreversible". Verhttps://en.wikipedia.org/wiki/Lossy_compression.
Respuesta4
Es casi seguro que se perdió información al convertir a JPEG. Convertir ese archivo a BMP preservará la información almacenada en el JPEG, pero volver a convertir el BMP a JPEG probablemente hará que pierda aún más información.