Guerrero, ¿puedes decirme cómo leer el ancho y el alto de una imagen binaria png en C? Gracias
La primera parte es el encabezado del archivo de mapa de bits BITMAPFILEHEADER. La estructura se define de la siguiente manera:
typedefstructtagBITMAPFILEHEADER{
WORD bfType; DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
}BITMAPFILEHEADER;
La estructura La longitud se fija en 14 bytes (WORD es un entero de 16 bits sin signo, DWORD es un entero de 32 bits sin signo) y la descripción de cada campo es la siguiente:
bfType
Especifique el tipo de archivo, debe ser 0x424D, que es la cadena "BM", lo que significa que los primeros dos bytes de todos los archivos .bmp son "BM". Los primeros dos bytes del archivo bmp son "BM"
bfSize
Especifica el tamaño del archivo, incluidos estos 14 bytes
bfReserved1, bfReserved2
p>Es una palabra reservada y no se considera.
bfOffBits
Es el número de bytes de desplazamiento desde el encabezado del archivo hasta los datos del mapa de bits reales, es decir, from El número de bytes de desplazamiento desde el encabezado del archivo hasta los datos del mapa de bits reales, es decir, la suma de las longitudes de las primeras tres partes en la Figura 3.
La segunda parte es el encabezado de información del mapa de bits BITMAPINFOHEADER, que también es una estructura definida de la siguiente manera:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
biWidth LARGO;
biHeight LARGO;
BiPlanes de WORD;
biBitCount de WORD
biCompresión DWORD;
WORD biSizeImage ;
biXPelsPerMeter LARGO;
biYPelsPerMeter LARGO;
DWORD biClrUsed;
DWORD biClrImportant;
} La longitud de la estructura se fija en 40 bytes (WORD es un entero de 16 bits sin signo, DWORD es un entero de 32 bits y LONG es un entero de 32 bits)
La descripción de cada campo es el siguiente:
biSize
Especifique la longitud de la estructura, es decir, 40
biWidth
Especifique el ancho de la imagen (en píxeles)
Especifica el ancho de la imagen (en píxeles)
Especifica la longitud de la estructura en píxeles. Especifica el ancho de la imagen en píxeles
biHeight
Especifica el alto de la imagen en píxeles
biPlanes
Debe ser 1, No es necesario considerar
biBitCount
Especifica el número de bits utilizados para representar los colores. Los valores comunes son 1 (para imágenes en blanco y negro), 4 (para imágenes de 16 colores). ), 8 (para imágenes de 16 colores) y 9 (para imágenes de 16 colores). Mapeo de color), 8 (256 colores), 24 (mapeo de color verdadero) (el nuevo formato .bmp admite colores de 32 bits, que no se discutirán aquí).
biCompression
Especifica si el mapa de bits está comprimido. Los valores válidos son BI_RGB, BI_RLE8, BI_RLE4 y BI_BI_BITFIELDS (todos son constantes definidas por Windows). Tenga en cuenta que los mapas de bits de Windows se pueden comprimir utilizando los formatos RLE4 y RLE8, pero no se utilizan habitualmente. El único caso que discutiremos en el futuro es el primer caso sin comprimir, donde biCompression es BI_RGB.
biSizeImage
Especifica el número de bytes ocupados por los datos de mapa de bits reales, que en realidad se pueden calcular mediante la siguiente fórmula:
biSizeImage=biWidth '*biHeight
p>Tenga en cuenta que biWidth ' en la fórmula anterior debe ser un múltiplo entero de 4 (por lo que biWidth ' debe usarse en lugar de biWidth', que representa el entero múltiplo de 4 más cercano que sea mayor o igual a biWidth Por ejemplo, si biWidth=240, entonces biWidth '=240; si biWidth=241, entonces biWidth '=244) Si biCompression es BI_RGB, este elemento puede ser cero
biXPelsPerMeter
.Especifica la resolución horizontal del dispositivo de destino (la unidad es píxeles por metro), el concepto de resolución se presentará en detalle en la sección de impresión.
biYPelsPerMeter
Especifique la resolución vertical del dispositivo de destino, en píxeles por metro, como se indica arriba.
biClrUsed
Especifica el número real de colores utilizados en esta imagen; si el valor es cero, el número de colores utilizados es biBitCount multiplicado por 2.
biClrImportant
Especifica el número de colores importantes en esta imagen; si el valor es cero, todos los colores se consideran importantes.
La tercera parte es la paleta (Palette). Por supuesto, está preparada para archivos de mapa de bits que requieren una paleta. Algunos mapas de bits, como las imágenes en color verdadero mencionadas anteriormente, no requieren una paleta. BITMAPINFOHEADER va seguido directamente de los datos del mapa de bits.
La paleta es en realidad una matriz*** que contiene elementos biClrUsed (o biBitCount multiplicado por 2 si el valor es cero). El tipo de cada elemento en la matriz es una estructura RGBQUAD, que ocupa 4 bytes y se define de la siguiente manera:
typedef struct tagRGBQUAD{
BYTE rgbBlue; este color
BYTE rgbGreen; //El componente verde de este color
BYTE rgbRed //El componente rojo de este color
BYTE rgbReserved //Reservado
}. RGBQUAD;
La cuarta parte son los datos de la imagen real. Para mapas de bits que utilizan una paleta, los datos de la imagen son el valor de índice del píxel en la paleta, mientras que para una imagen en color verdadero, los datos de la imagen son los valores reales R, G, B. A continuación se describen mapas de bits de 2 colores, 16 colores, 256 colores y mapas de bits de color verdadero.
Para mapas de bits de dos colores, 1 bit puede representar el color del píxel (normalmente 0 significa negro, 1 significa blanco), por lo que 1 byte puede representar 8 píxeles.
Para un mapa de bits de 16 colores, se utilizan 4 bits para representar el color del píxel, por lo que un byte puede representar 2 píxeles.
Para un mapa de bits de 256 colores, un byte puede representar exactamente 1 píxel.
Para mapas de color verdadero, 3 bytes pueden representar 1 píxel. Vaya, esto cuesta espacio. ¿Quién te pidió que hicieras que el color del mapa pareciera más brillante?
Hay dos puntos a tener en cuenta:
1. El número de bytes en cada línea debe ser un múltiplo entero de 4. Si no, es necesario complementarlo. Este punto se mencionó antes cuando se introdujo biSizeImage.
2. En términos generales, los datos de los archivos .BMP se organizan de abajo hacia arriba y de izquierda a derecha. Es decir, el primer píxel a la izquierda de la fila inferior de la imagen se lee del archivo, luego el segundo píxel a la izquierda... y luego el primer píxel a la izquierda de la penúltima fila, el segundo píxel. la izquierda... y así sucesivamente, lo último que se lee es el píxel más a la derecha de la fila superior.
Después de comprender esto, puede usar el binario "rb" para abrir la imagen png que se va a leer
ARCHIVO *fp
if (! (fp= open("filename", rb)))
printf("open file error");
Una vez que la apertura se realiza correctamente, el contenido del archivo se puede leer a través del contenido del puntero del archivo. .