Especificación de gráficos de red portátiles (PNG) (segunda edición)
Versión actual: orden de bytes de trabajo).
Los procesadores X86 y ARM que actualmente se usan comúnmente en los hosts están en modo little-endian, lo que se denomina orden de bytes del host.
PNG utiliza el orden de bytes de la red.
Las imágenes normales en color verdadero se componen de al menos tres canales: rojo, verde y azul, es decir, cada píxel ocupa más de tres bytes de espacio. Por tanto, la eficiencia de compresión de imágenes es muy baja.
Así que construimos una paleta de colores, preestablecemos los colores que necesitamos usar en la paleta de colores y solo necesitamos proporcionar la posición del índice de la paleta de colores para su uso posterior.
Y para evitar que la paleta ocupe demasiado espacio, configuramos la capacidad de la paleta en 256. La posición del índice no excederá 256 y solo necesita un byte para representarlo. Un byte solo ocupa un canal, por lo que el modo de índice tiene un solo canal.
Una imagen se compone de muchos píxeles y puede considerarse como una matriz bidimensional. Podemos extraer varias posiciones especiales, como cada dos píxeles de la fila horizontal y cada dos píxeles de la columna vertical, formando así una nueva matriz bidimensional que puede representar la imagen original de forma concisa y distorsionada. Este método de extracción se llama extracción de pase. Los datos formados después de la extracción se entrelazan y cada segmento puede contener una miniatura de la imagen completa. Solo es necesario recombinarlo para producir una imagen completa, incluso si no hay datos completos, solo una parte puede obtener una miniatura. Es una forma de acelerar la transmisión de imágenes en la transmisión de red, pero ahora la velocidad de la red es demasiado rápida y es casi inútil.
La zona media de la carta de color es blanca, a la que llamamos punto blanco, que es un parámetro de la carta de color. Otro parámetro es la base, que se utiliza para la conversión del mapa de colores.
Podemos cambiar el área blanca central estableciendo las coordenadas del punto blanco, desplazándolo hacia rojo, verde y azul, ajustando así el grado de cambio del mapa de color.
La especificación PNG no especifica la interfaz de la aplicación, pero involucra cuatro tipos de imágenes: imágenes originales, imágenes estándar, imágenes PNG e imágenes entregadas. Esta relación es la siguiente:
El número de bits ocupados por la codificación binaria es la profundidad de la muestra.
PNG tiene tres formas de gestionar el espacio de color: configuración ICC, configuración sRGB, referencia cromática y configuración de posición del punto blanco.
La configuración ICC es flexible y fácil de adaptar; la configuración SRGB requiere establecer un espacio de color específico y puede ocupar más capacidad, esta última es más precisa. Para los dos primeros, también se recomienda utilizar valores Gamma.
Necesitamos alguna forma de convertir imágenes estándar en imágenes PNG. El proceso es el siguiente:
Separar el canal transparente De hecho, muchas imágenes estándar no tienen un canal transparente y pueden ser opacas por defecto, guardando un canal.
Se puede crear un índice si el número de valores de píxeles distintos es inferior a 256 y la profundidad de la muestra es inferior o igual a 8.
Si las muestras de color tienen la misma profundidad y cada canal tiene el mismo valor, se puede utilizar un canal para representar todo, es decir, una imagen en escala de grises.
Un método para expresar transparencia sin canal alfa, que requiere configurar el color de fondo.
PNG no admite todas las profundidades, solo 1, 2, 4, 8 y 16. Si no son estos números, la profundidad debe ajustarse mediante software.
Por ejemplo, la profundidad original era 5, pero ahora es necesario cambiarla a 8, lo que significa que se ha ampliado.
Si diferentes canales tienen diferentes profundidades, seleccionaremos la profundidad máxima para el ajuste.
Esta conversión de profundidad es reversible.
Hay cinco * * *:
Aquí, se utilizan dos métodos para extraer Pass.
El primero es un método vacío, lo que significa no hacer nada. (Entonces, ¿por qué se considera esto de manera tan estricta como un método?)
En el segundo método, se obtienen siete imágenes reducidas a través de múltiples escaneos. Es decir, el algoritmo Adam7 (no el algoritmo Adam de aprendizaje profundo).
Sin embargo, este algoritmo difícilmente se puede encontrar en sitios web nacionales y no queda muy claro en Wikipedia (https://en. Wikipedia. org/wiki/Adam 7_algorithm). Así que simplemente diré algo aquí:
Lea la imagen reducida de arriba (por supuesto, la imagen original se lee usando el método vacío) línea por línea. (Aquí puede haber muchas operaciones, como convertir la extracción anterior en rendimiento).
Hay varios tipos de filtros, que se escribirán antes de la matriz de filtros.
Es codificación y cifrado.
Dividir los datos codificados en uno o más fragmentos.
Un archivo PNG estándar consta de muchos bloques, cada bloque tiene cuatro partes: longitud, nombre, cuerpo de datos y código de verificación.
La definición PNG estándar tiene 18 tipos de bloques y puedes agregar bloques personalizados.
Estos 18 tipos de bloques son:
Bloques clave:
IHDR (encabezado de imagen), PLTE (paleta de paleta), IDAT (contenido de imagen de datos de imagen), IEND (final del archivo de imagen).
Bloque auxiliar:
Correlación transparente: información transparente
Correlación de color: chrm (croma y punto blanco), gAMA (valor gamma gamma), iCCP (incrustado Descripción general de ICC integrada del perfil ICC), sBIT (bit válido), sRGB (espacio de color RGB estándar).
Relacionados con texto: iTXt (texto internacional con datos de texto internacionalizado), Text (texto con datos de texto), zTXt (texto comprimido con datos zip).
Correlación temporal: hora (hora de la última modificación)
Otros: bKGD (color de fondo), hIST (histograma), pHYs (tamaño de píxel físico), sPLT (muestras de ajuste recomendadas),
Errores de transmisión o corrupción de archivos, que destruirán la mayor parte o la totalidad del flujo de datos, errores de sintaxis, bloques no válidos o bloques faltantes.
Se debe hacer una distinción entre estos dos métodos de manejo de errores.
Se pueden enviar extensiones relevantes al grupo ISO/IEC o PNG, se pueden registrar nuevos tipos de bloques y palabras clave de texto, y se pueden extender nuevos algoritmos de filtrado, algoritmos de modo entrelazado y algoritmos de compresión.
Es la estructura binaria del flujo de datos.
Los primeros ocho caracteres de todos los flujos de datos PNG son 137 80 78 78 7131026 10.
Bytes significa b'\x89PNG\r\n\x1a\n '
Esta firma significa que los siguientes datos son todos flujos de datos PNG. Si encuentra caracteres nulos, no los interrumpa; necesita IEND para completar.
Cada módulo consta de las siguientes cuatro partes:
A través de la convención de nombres, el decodificador PNG puede obtener información relevante a través del nombre cuando no puede identificar el propósito del bloque actual.
El nombre de un bloque tiene cuatro números:
El primer dígito indica auxiliar, las minúsculas indican que este bloque es auxiliar y las mayúsculas indican que este bloque es clave.
El segundo dígito indica privado, las minúsculas indican que este bloque es privado, no existe una definición estándar internacional y el tamaño indica el tipo de 18 bloques mencionado anteriormente.
El tercer bit es un bit reservado, minúscula significa que el bloque se descarta y mayúscula significa que se puede utilizar. (usado para acordar futuras extensiones)
El cuarto dígito indica seguridad de copia, es decir, al editar una imagen, si el editor PNG encuentra un bloque de datos inseguro, no lo copiará por completo, sino que lo copiará selectivamente. él. . Las mayúsculas significan que el editor PNG puede copiarlo exactamente sin preocuparse por ningún problema.
Consulta el algoritmo crc32 para obtener más detalles.
Porque las imágenes PNG se pueden transmitir, es decir, se pueden previsualizar en un navegador PNG sin leer el final del archivo.
Por lo tanto, debes preparar algo antes de leer el contenido de la imagen, como la paleta de índice.
¿Parece que se ha escrito el Capítulo 4.3?
Como escribimos en el Capítulo 4.4, hay cinco tipos de color:
Los tipos de color se registran en IHDR.
En modo gris, el brillo depende de gamma, sRGB, iCCP, si no, depende de la máquina.
Las muestras de color no son necesariamente proporcionales a la intensidad de la luz y se pueden ajustar configurando gAMA.
El valor se calcula de la siguiente manera: inicialmente 0, suma 1 para usar la paleta, suma 2 para usar el color verdadero y suma 4 para usar el canal de transparencia. La indexación no se puede utilizar en escala de grises.
La transparencia se puede expresar de cuatro maneras: usando un canal transparente, usando un bloque tRNS para establecer información de color transparente, configurando una tabla alfa en tRNS en el índice y no usando un canal transparente o tRNS para expresar completa opacidad.
La profundidad de muestreo del canal de transparencia es 8 y 16. El canal de transparencia se almacena en píxeles y representa completamente transparente y completamente opaco. La transparencia se utiliza para combinar los colores de primer plano y de fondo de una imagen.
Algunas imágenes normales no contienen transparencia, e incluso el valor de píxel se ha multiplicado por la transparencia, y el paso compuesto con fondo negro se ha realizado de antemano, pero Papúa Nueva Guinea no lo hace;
El número entero (int) es multibyte, el corto es 2, el int es 4 y el largo es 8.
PNG utiliza el orden de bytes de la red, con el MSB en el bit alto y el LSB en el bit bajo.
Es decir, las filas y píxeles de cada imagen PNG están organizados de forma compacta.
Cuando la profundidad es inferior a 8, el final de la línea de escaneo puede tener bytes no coincidentes y estos bytes no utilizados no se procesarán.
Los filtros pueden mejorar la compresibilidad de los datos comprimidos y son reversibles. PNG permite filtrar datos de líneas de exploración; en otras palabras, se puede filtrar sin filtrar.
La secuencia de bytes después del filtrado es la misma que antes del filtrado, pero dependiendo del tipo de filtrado, se agregará una marca de byte al frente. Si la longitud no aumenta, no hay filtrado. El método de filtrado específico se explicará más adelante.
El modo entrelazado puede mejorar la velocidad de carga de imágenes de red en monitores CRT (en otras palabras, sin una red y un monitor CRT, el modo entrelazado es inútil).
Consulte [4.5.2 Extracción de canales](#4.5.2 Extracción de canales)
Debido a las características de Adam7, las imágenes con un ancho o alto inferior a 5 carecerán miniaturas (quinto 2 en la columna y 3 en la quinta fila).
El objetivo del filtrado es mejorar la relación de compresión. No existe una única forma de filtrar. En el modo entrelazado, todas las imágenes reducidas deben utilizar el mismo filtro. En el modo no entrelazado, sólo hay una imagen y, por supuesto, sólo un método.
El método 0 está definido en este estándar, otros números están reservados para uso futuro. El método 0 contiene cinco tipos de filtros y cada línea de exploración puede utilizar un tipo de filtro diferente.
La especificación PNG no exige el tipo de filtro y el método de selección específico se analizará más adelante.
Este filtro se aplica a bytes, independientemente de píxeles, canales y profundidad. Solo da bytes para filtrar.
Las siguientes son las definiciones de varios parámetros:
Org() representa el valor original del byte
Flt() representa el valor filtrado;
p>
Rc() representa el valor reconstruido;
Paeth(), consulte [9.4 Tipo de filtro 4](#9.4 Tipo de filtro 4).
Si no hay ningún píxel anterior, utilice 0. La primera línea de cada miniatura no tiene línea anterior y también se reemplaza por 0.
Dado que se utiliza filtrado, la reconstrucción también debe calcularse en este orden.
Los valores de entrada y salida del filtro son bytes sin signo.
Los tres tipos de filtros 0, 1 y 2 son muy simples, son resta alterna de columnas/filas entrelazadas.
Pero en el tercer tipo, FLT(x)= Org(x)-floor((Org(a)+Org(b))/2), Org(a)+Org(b ) se desborda , por lo que las operaciones de bytes no se pueden utilizar y deben ser cortas o de varios bits. Por supuesto, también existe el algoritmo de desplazamiento a la derecha.
El algoritmo Paeth primero calcula los valores lineales de tres píxeles adyacentes (izquierda, arriba, izquierda) y luego selecciona el píxel adyacente más cercano al valor calculado para volver a calcular. Tenga cuidado de no desbordar el caché. Sus funciones son las siguientes:
Igual que el filtro anterior, el valor predeterminado es el método 0. Estos dos están marcados en IHDR.
Por supuesto, aquí se utiliza la compresión zlib, el nivel predeterminado es 8 y los bytes comprimidos no superan los 32768.
Este valor de verificación es diferente del valor de verificación del bloque PNG y no se puede confundir.
Empaquete y comprima varias líneas filtradas en un flujo de datos zlib, coloque varios bloques PNG y descomprima varios bloques PNG para obtener un flujo de datos zlib.
Por supuesto, esto también implica lectura asincrónica. El propio flujo de datos de Zlib se puede interrumpir. Incluso si se interrumpe, los datos previamente organizados aún se pueden leer, de modo que se pueda interpretar el patrón de entrelazado. Por lo tanto, para el método de Python anterior, se realizaron las siguientes mejoras:
Construir lectura, lectura y análisis continuos.
La siguiente es una introducción a los 18 bloques de especificación PNG:
IHDR es el primer bloque en el flujo de datos PNG. La composición es la siguiente:
Entonces, la longitud del bloque de IHDR es 13 y no cambiará.
La paleta es una matriz bidimensional, que puede considerarse como Matriz [n] [3], y el color está representado por el índice n.
Entonces n no excederá 256 y la longitud del bloque PLTE también es múltiplo de 3.
En todos los casos, la paleta de colores tiene 8 bits de profundidad. Aunque la imagen sea 1, 2, 4, la paleta sigue siendo 8.
Todos los bloques IDAT juntos son un flujo de datos zlib, consulte [10 Compresión] (#10 Compresión).
Estos datos están vacíos, lo que indica el final del flujo de datos PNG. Por supuesto, si este bloque está dañado, todo estará bien.
Este es un bloque que representa información de transparencia, el cual tiene tres componentes:
Modo escala de grises (cualquier color igual a esta escala de grises se considera transparente)
Color verdadero modo (el color transparente está representado por estos tres valores)
Modo índice (en modo índice, tRNS es equivalente a una tabla alfa, tan grande como el índice, lo que indica la transparencia del índice)
¿Por qué el modo de escala de grises y el modo de color verdadero están representados por 2 bytes? Porque necesita acomodar una profundidad de 16 bits y la profundidad del modo de índice siempre es menor o igual a 8.
Este módulo se utiliza para configurar el espacio de cromaticidad CIE. La composición es la siguiente:
El valor almacenado es 100.000 veces el valor real.
El espacio de cromaticidad CIE es una imagen bidimensional, que consta de cuatro puntos de rojo, verde, azul y blanco, que forman un triángulo miope para establecer el grado de desviación del color.
Este bloque solo almacena un int sin signo y su valor debe dividirse entre 100000 para obtener el valor gamma real.
Este bloque se utiliza para establecer la descripción ICC.
PNG solo admite profundidad fija. Si la profundidad no coincide con la imagen original, se verá obligado a acercar o alejar, pero se conservará la información original y se restaurará la imagen original. (Por lo tanto, generalmente no se usa. ¿Por qué convertir imágenes estándar en imágenes no estándar?)
Los diferentes números de canales tienen diferentes longitudes de sBIT.
Utiliza el espacio de color sRGB, que actualmente no puede ser descrito por ICC. SRGB contiene solo un byte sin firmar, que representa la intención de representación.
El significado de este valor es el siguiente:
Se recomienda utilizar GAMA y cHRM cuando se utiliza sRGB, debido a que algunos dispositivos no admiten sRGB, por lo que se pueden utilizar compatibles.
Las anteriores son las palabras clave utilizadas en los mensajes de texto. En realidad, la palabra clave no es muy crítica, es solo una definición y puede cambiarla usted mismo. Pero se puede leer mediante estándares de software de imágenes.
El texto contiene los siguientes componentes:
Por supuesto, el método de compresión aquí también es 0, y zlib se usa para descomprimir los datos posteriores.
Los datos de texto internacional son un poco elevados.
Para tipos de idiomas, consulte RCF-3066, ISO 646 e ISO 639.
Color de fondo.
El histograma da la frecuencia aproximada de uso de cada color de la paleta.
Si el navegador PNG no puede proporcionar todos los colores de la paleta, el histograma puede ayudar a crear una paleta similar.
Por supuesto, ningún software puede proporcionar una paleta de colores completa.
Este bloque se utiliza para representar el tamaño real de los píxeles en la pantalla. Su estructura es la siguiente:
Hay dos descripciones de unidades. Si es falso, significa que el bloque solo representa la relación de aspecto, no el valor real. Cuando es Verdadero, la unidad son metros, es decir, una unidad es un metro y cuántos píxeles se incluyen en un metro.
La longitud específica del canal está determinada por la profundidad de la muestra. La profundidad de 16 es dos y la profundidad de 8 o menos es uno.
Los nombres de las paletas distinguen entre mayúsculas y minúsculas y están sujetos a argumentos de palabras clave.
En imágenes PNG en escala de grises, cada destino suele tener valores iguales de rojo, verde, azul y azul, pero esto no es obligatorio.
Cada valor de frecuencia es proporcional a la proporción de píxeles de la imagen, no a la frecuencia real.
Aquí se utiliza la hora universal (UTC).
La siguiente fórmula es demasiado complicada, olvídalo, digámoslo.