Cómo está montado un PNG
Un PNG empieza con una firma de ocho bytes, una huella fija que permite a cualquier programa confirmar que el archivo es de verdad un PNG. Todo lo que viene después es una serie dechunks, y cada chunk es un paquetito ordenado: una longitud, un tipo de cuatro letras, los datos en sí y una suma de comprobación de cuatro bytes.
Tres tipos de chunk cargan con toda la imagen. IHDR va primero y almacena lo esencial: ancho, alto, profundidad de bits y tipo de color. IDAT contiene los datos de imagen comprimidos, a veces repartidos en varios chunks IDAT seguidos. IEND es un diminuto marcador de fin que indica que el archivo está completo. Dentro de los chunks IDAT, los píxeles se comprimen con deflate, el mismo algoritmo que usa ZIP, un único flujo continuo desde la fila superior de la imagen hasta la inferior.
Un PNG, de principio a fin: una firma, una cabecera con las dimensiones, los datos de imagen comprimidos y un marcador de fin.
El detalle que hace especial al PNG es la suma de comprobación en cada chunk. Es un CRC-32, calculado sobre el tipo y los datos del chunk, y convierte el formato en algo que se audita a sí mismo constantemente. Por eso un PNG puede señalar su propio daño con una precisión que la mayoría de los formatos no alcanzan.
El daño que un PNG se quita de encima
Como cada chunk se comprueba y se describe a sí mismo, toda una categoría de daños en un PNG tiene un arreglo limpio y determinista: la respuesta correcta se puede conocer, no adivinar.
Suma de comprobación mal, datos bien
El caso más benévolo: los datos de un chunk están bien pero su CRC almacenado ya no coincide, así que los decodificadores estrictos rechazan el archivo. Volver a calcular el CRC a partir de los datos y reescribirlo hace que el archivo vuelva a ser válido sin ninguna pérdida. La suma de comprobación era lo único que estaba mal.
Dimensiones a cero o erróneas
Si el ancho o el alto del IHDR se ponen a cero o se revuelven, ningún decodificador puede preparar un lienzo y el archivo no abre. Pero el IHDR lleva su propio CRC, calculado en su día cuando las dimensiones eran correctas. Eso permite que una herramienta de reparación encuentre la respuesta por fuerza bruta: probar valores candidatos de ancho y alto, volver a calcular la suma de comprobación para cada uno y detenerse cuando coincide con el CRC almacenado. Las dimensiones originales salen directamente de las cuentas, sin adivinar nada.
Saltos de línea destrozados en la transferencia
Un clásico: un PNG enviado a través de un sistema que convierte los finales de línea «por ayudar», un cliente de FTP antiguo en modo texto, o un script que reescribió el archivo como texto. Cambia cada par de retorno de carro y salto de línea por un salto de línea solo, o al revés, corrompiendo bytes por todas partes. La propia firma del PNG está diseñada para detectar justamente esto, y cuando el destrozo es una sustitución consistente y reversible, la transformación se puede deshacer y los bytes originales se pueden restaurar.
Truncamiento: las filas de arriba vuelven
El truncamiento es la forma más común en que se rompen los PNG: una descarga que se detuvo al 80 por ciento, una copia interrumpida al retirar una unidad, un archivo guardado por un programa que se bloqueó a mitad de escritura. La parte delantera del archivo está intacta y la cola sencillamente falta, normalmente incluido el marcador IEND, y por eso tantos visores se quejan de que el archivo está incompleto.
Un PNG truncado: la cabecera y la parte de arriba de los datos de imagen sobrevivieron; el resto del flujo y el marcador de fin nunca llegaron.
Como la imagen se escribe de arriba abajo, un PNG truncado se rescata en la parte superior de la foto: píxeles reales, hasta el punto donde terminan los datos. Una reparación reescribe un final válido para que un decodificador acepte el archivo y dibuje lo que sobrevivió. Las filas por debajo del corte no están dañadas, están ausentes, así que no se pueden devolver. Esto es un parcial honesto, el mismo tipo de resultado que da un JPEG truncado en el lado de la reparación de fotos.
Daño a mitad del flujo: por qué las filas de debajo desaparecen
El daño que cae en mitad de los datos IDAT, en lugar de al final, es el caso difícil, y la razón es deflate. Deflate comprime la imagen como un único flujo continuo en el que cada parte depende de lo que vino antes. No tiene marcadores periódicos con los que resincronizarse, así que en cuanto el decodificador topa con un byte corrupto, pierde el hilo y no lo puede recuperar. Todo lo que hay después del daño se decodifica como ruido.
En la práctica eso significa que un solo byte defectuoso a media altura puede costarte todas las filas que hay debajo, no solo una línea. La foto está limpia por encima del impacto y es basura por debajo. Una reparación aún puede rescatar las filas que se decodificaron antes del daño, lo que vale de verdad la pena, pero no puede recoser el flujo más allá de la rotura. Compáralo con los formatos que almacenan un índice aparte de sus datos: ahí, reconstruir el índice puede rescatarlo todo. El PNG guarda sus píxeles en un único flujo deflate indivisible, así que una herida a mitad del flujo es permanente por debajo del corte.
Qué es recuperable, en una lista honesta
Clasifica tu PNG roto en una de estas y sabrás el pronóstico antes de gastar ningún esfuerzo:
- Suma de comprobación que no coincide, datos intactos.Arreglo determinista, sin pérdida. Vuelve a calcular el CRC y el archivo vuelve a ser válido.
- Dimensiones a cero o revueltas. Arreglo determinista en la mayoría de los casos. La suma de comprobación almacenada del IHDR revela el tamaño original.
- Destrozo de saltos de línea por la transferencia.Reversible cuando la sustitución fue consistente. Deshaz la transformación, restaura los bytes.
- Archivo truncado. Parcial. La parte de arriba de la imagen vuelve; la cola que falta no.
- Corrupción de IDAT a mitad del flujo. Parcial en el mejor de los casos. Limpio por encima del daño, perdido por debajo, porque deflate no puede resincronizarse.
- Cero bytes o todo ceros. No es un caso de reparación. No hay ninguna imagen en el archivo que reconstruir; eso es un problema de recuperación.
La reparación de PNG está junto a las herramientas de otros formatos en elíndice de herramientas de reparación. En cualquier casilla en la que caiga tu archivo, una buena herramienta te dice la verdad sobre él en lugar de prometerte que las filas grises vuelven.
Preguntas frecuentes
¿Por qué no abre mi PNG?
Normalmente una de tres cosas: la firma de ocho bytes que hay justo al principio está dañada, así que los visores no reconocen el archivo como un PNG en absoluto; el chunk de cabecera (IHDR) que almacena las dimensiones de la imagen está mal o a ceros, así que un decodificador no puede preparar un lienzo; o los datos de imagen comprimidos se truncaron o se corrompieron a mitad. Los dos primeros suelen ser arreglos deterministas porque el PNG almacena una suma de comprobación por cada chunk. El tercero es donde empiezan los límites honestos: las filas de imagen que no estuvieran en el archivo no se pueden recuperar.
¿Qué significa un error de CRC en un PNG?
Cada chunk de un PNG termina con una suma de comprobación CRC-32 de cuatro bytes calculada sobre el tipo y los datos de ese chunk. Cuando un decodificador vuelve a calcular la suma de comprobación y no coincide con el valor almacenado, informa de un error de CRC, lo que significa que los bytes de ese chunk han cambiado desde que se escribió el archivo. Si lo único que está mal es la propia suma de comprobación y los datos están bien, volver a calcularla arregla el archivo del todo. Si los datos cambiaron, el CRC está haciendo su trabajo al avisarte, y lo recuperable que sea la imagen depende de qué chunk se vio afectado.
¿Se puede recuperar un PNG truncado?
Parcialmente, y solo la parte de arriba. El PNG comprime su imagen con deflate y escribe las filas de arriba abajo, así que un archivo cortado antes de tiempo se decodifica de forma limpia hasta el punto donde terminan los datos, y luego se detiene. Recuperas la parte superior de la imagen como píxeles reales. Las filas por debajo del corte nunca estuvieron en el archivo, así que ninguna herramienta puede restaurarlas. Un PNG truncado reparado es un parcial honesto: tu imagen real, hasta donde llegan los bytes.
¿Por qué falta o sale distorsionada la parte de abajo de mi PNG?
Porque deflate, la compresión que usa el PNG, es un flujo continuo sin forma de resincronizarse tras un daño. Si la corrupción cae en mitad de los datos de imagen y no al final, el decodificador pierde el hilo en ese byte y todo lo que hay a partir de ahí se decodifica como ruido, no solo la única fila dañada. Por eso el daño a mitad del flujo suele costarte todas las filas por debajo del impacto, mientras que un truncamiento limpio al menos deja la parte de arriba intacta.
Una foto que abre con la mitad inferior en gris tiene un pariente cercano en el mundo JPEG: por qué media foto JPEG sale gris.