Repáralo ahora
- Suelta el archivo
- La reparación ocurre en local
- Descarga el resultado
Cuando una captura guardada como .png no abre, el visor suele ser estricto con algo que el formato le permite comprobar con exactitud. Fotos de Windows dice "It looks like we don't support this file format" (parece que no admitimos este formato) o "This file can't be opened" (no se puede abrir este archivo); Vista Previa de macOS dice que el archivo "puede estar dañado o usar un formato que Vista Previa no reconoce"; las herramientas basadas en libpng lanzan IDAT: CRC error, IHDR: CRC error o Not a PNG file. Suelta el archivo arriba y la herramienta lo recorre chunk a chunk en tu navegador —verificando cada CRC, comprobando la firma de 8 bytes y la geometría de IHDR, y decodificando el flujo DEFLATE hasta donde sobreviva— y luego reescribe un archivo válido alrededor de lo que realmente hay. No se sube nada; una captura muestra a menudo un saldo bancario, un mensaje privado o un portal médico, y nunca tiene que salir de tu equipo para revisarla.
Cómo está construida una captura PNG
Todo PNG empieza con la misma firma de 8 bytes —89 50 4E 47 0D 0A 1A 0A—, una huella deliberadamente cargada de trampas: el byte con el bit alto 0x89 detecta canales de solo 7 bits, el 0D 0A y el 0A suelto detectan la conversión de fin de línea, y el 1A (fin de archivo de DOS) frena a un type descuidado antes de que vuelque el resto. Después viene una serie de chunks, cada uno un paquete ordenado: una longitud de 4 bytes big-endian, un tipo ASCII de 4 bytes, los datos y un CRC-32 de 4 bytes calculado sobre el tipo y los datos (nunca la longitud) con el polinomio reflejado estándar 0xEDB88320.
Tres chunks llevan la imagen. IHDR va primero y siempre ocupa 13 bytes: anchura (u32), altura (u32) y luego bytes sueltos para la profundidad de bits, el tipo de color, el método de compresión, el método de filtro y el método de entrelazado. Una captura de un sistema operativo moderno es casi siempre de 8 bits, sin entrelazar, con tipo de color 2 (color verdadero) o 6 (color verdadero con alfa). IDAT contiene la imagen, a veces repartida en varios chunks IDAT consecutivos; dentro hay un flujo zlib (byte de cabecera 0x78) de líneas de barrido filtradas comprimidas con DEFLATE — cada fila precedida por un byte de filtro 0–4 (None, Sub, Up, Average, Paeth), escritas de arriba abajo. IEND es el marcador de final vacío, con un CRC fijo de AE 42 60 82.
Las capturas también llevan chunks auxiliares reconocibles —la primera letra en minúscula los marca como opcionales— como pHYs (densidad de píxeles, para que una captura Retina indique su escala), iCCP o sRGB (perfil de color), tEXt/eXIf (metadatos que estampa la herramienta de captura). Estos pueden dañarse o perderse sin perder un solo píxel, porque a un decodificador se le permite saltarse cualquier chunk auxiliar que no entienda.
El daño que tiene un arreglo limpio y determinista
Como cada chunk se autoverifica, toda una clase de daños del PNG tiene una respuesta conocible en lugar de una conjetura:
- Suma incorrecta, datos correctos. La falsa alarma más común: los bytes de un chunk están intactos pero su CRC almacenado ya no coincide, así que los decodificadores estrictos (y
pngcheck) rechazan el archivo conCRC error in chunk IDAT. Recalcular el CRC-32 a partir de los datos y reescribirlo vuelve a validar el archivo con cero pérdidas: la suma de comprobación era lo único que fallaba. - Dimensiones a cero o alteradas. Si la anchura o la altura de IHDR está a cero, ningún decodificador puede reservar un lienzo y el archivo no abre. Pero IHDR lleva su propio CRC, calculado cuando los números eran correctos. Eso permite a la reparación forzar la geometría por fuerza bruta: probar valores candidatos de anchura/altura, recalcular el CRC del chunk para cada uno y detenerse cuando coincide con el valor almacenado. Las dimensiones originales salen directamente de la aritmética — sin adivinar.
- Corrupción por saltos de línea / modo texto. Una captura pasada por un cliente FTP en modo ASCII, un puente de chat o un script que la reescribió como texto cambia cada
0D 0Apor un0Asuelto (o al revés), corrompiendo bytes por todo el archivo. La firma está diseñada para detectar justamente esto, y cuando la sustitución es consistente se puede revertir byte a byte. - IEND ausente o roto. Un archivo por lo demás completo pero que perdió su marcador de final dispara avisos de "archivo incompleto"; reescribir un IEND válido permite a un decodificador estricto aceptar la imagen que ya está entera.
El daño que te cuesta filas
Los límites honestos empiezan donde los propios datos de píxeles ya no están, y las capturas caen en ambos casos.
Truncamiento: la parte de arriba vuelve. Es la forma más común en que se rompe una captura: un guardado interrumpido por un disco lleno, una copia cortada al desconectar un móvil, una sincronización en la nube que se detuvo al 80 por ciento. La parte delantera del archivo está intacta y la cola —normalmente incluido IEND— simplemente falta. Como las líneas de barrido se escriben de arriba abajo, un PNG truncado se rescata en la parte superior de la imagen: píxeles reales hasta donde terminan los datos. La reparación reescribe un cierre 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 ninguna herramienta puede devolverlas: el resultado es un parcial honesto.
Daño en mitad de IDAT: la parte de abajo es ruido. Cuando la corrupción cae dentro del flujo DEFLATE en lugar de al final, la razón de que sea irrecuperable es el propio DEFLATE: es un único flujo continuo donde cada parte depende de lo anterior, sin marcadores periódicos con los que resincronizar. En cuanto el decodificador topa con el byte malo pierde el hilo (zlib informa de incorrect data check / invalid distance too far back), y todo lo que viene después se decodifica como ruido. Un solo byte alterado a media altura puede costarte todas las filas de debajo, no solo una línea: la imagen está limpia por encima del golpe y es basura por debajo. Por eso una captura abre con una parte superior nítida y una mitad inferior emborronada o gris, la misma forma de resultado que da un JPEG truncado.
Compáralo con los formatos que mantienen un índice separado de sus datos —el moov de un vídeo QuickTime, un b-tree de SQLite—, donde reconstruir el mapa rescata el archivo entero. El PNG guarda sus píxeles en un único flujo DEFLATE indivisible, así que una herida a media altura es permanente por debajo del corte.
Qué puede y qué no puede reparar
Puede reparar
- Un chunk cuyo CRC-32 almacenado ya no coincide con datos por lo demás intactos: se recalcula el CRC y el archivo valida con cero pérdidas
- Anchura/altura de IHDR a cero o alteradas, recuperadas forzando candidatos por fuerza bruta contra el propio CRC almacenado del chunk
- Corrupción por saltos de línea / modo texto (CR-LF ↔ LF) de una transferencia en modo ASCII o un script que reescribió el archivo como texto
- Un marcador de final IEND ausente o malformado en un archivo cuyos datos de imagen están por lo demás completos
- Una captura truncada: las filas superiores que sí se escribieron se decodifican de vuelta como píxeles reales
No puede reparar
- Las filas de imagen por debajo de un golpe a mitad de IDAT: DEFLATE no puede resincronizar, así que todo lo posterior al byte dañado es ruido
- Las filas por debajo del corte en un archivo truncado: esos píxeles nunca se escribieron y ninguna herramienta puede inventarlos
- Un archivo que se lee como 0 bytes o todo ceros: no hay imagen que reconstruir (eso es recuperación de datos, no reparación)
- Una captura que otra app volvió a codificar o recomprimir tras el daño: los píxeles erróneos ya están grabados
- La restauración píxel a píxel de una mitad inferior emborronada: la reparación devuelve un parcial honesto, no las filas grises
Si una reparación falla, te decimos por qué (datos que faltan frente a estructura dañada), y nunca se te cobra por una reparación fallida.