Red de conocimiento informático - Material del sitio web - Héroe, ¿puedes decirme cómo leer el ancho y el alto de un png binario usando el lenguaje C? ¡Gracias! ! !

Héroe, ¿puedes decirme cómo leer el ancho y el alto de un png binario usando el lenguaje C? ¡Gracias! ! !

¡Solo agregue 62 bytes de información de encabezado!

La primera parte es BITMAPFILEHEADER, que es una estructura definida de la siguiente manera:

typedefstructtagbitmapfile header {

WORD bfType

DWORD bfSize

p>

WORD bfreserved 1;

WORD bfReserved2

DWORD bfOffBits

} BITMAPFILEHEADER

La longitud de este La estructura es fija, 14 bytes (WORD es un entero sin signo de 16 bits, DWORD es un entero sin signo de 32 bits), cada campo se describe de la siguiente manera:

bfType

Especifica el tipo de archivo, que debe ser 0x424D, que es un carácter. La cadena "BM" significa todo. El archivo bmp es "BM".

bfSize

Especifica el tamaño del archivo, incluidos 14 bytes.

bfReserved1, bfReserved2

Si quieres conservarlo no te lo pienses.

bfOffBits

es el desplazamiento de bytes desde el encabezado del archivo hasta los datos reales del mapa de bits, que es la suma de las longitudes de las primeras tres partes en la Figura 3.

La segunda parte es el encabezado BITMAPINFOHEADER, que también es una estructura y se define de la siguiente manera:

typedef struct tagBITMAPINFOHEADER {

DWORD biSize

Largo, doble ancho;

Altura de relación de dragón;

Biplano de palabras;

Recuento de palabras

Compresión de palabras dobles;

DWORD biSizeImage

BiXPelsPerMeter largo

Medidor de pelvis doble largo;

DWORD biClrUsed

DWORD biClrImportant

} BITMAPINFOHEADER

La longitud de esta estructura es fija, 40 bytes (WORD es un entero de 16 bits sin signo, DWORD no está firmado.

Nº entero de 32 bits, LONG es un entero de 32 bits) y cada campo se describe de la siguiente manera:

biSize

Especifica la longitud de esta estructura, que es 40.

Doble ancho

Especifica el ancho de la imagen en píxeles.

Sobrepeso

Especifica la altura de la imagen en píxeles.

Biplano

Debe ser 1, independientemente.

biBitCount

Especifica el número de bits que se utilizarán al representar colores. Los valores comúnmente utilizados son 1 (imagen de dos colores en blanco y negro), 4 (imagen de 16 colores), 8 (imagen de 256 colores) y 24 (imagen en color verdadero) (nuevo. El formato bmp admite colores de 32 bits, que no se discutirá aquí).

Compresión dual

Especifica si el mapa de bits está comprimido. Los valores válidos son BI_RGB, BI_RLE8, BI_RLE4 y BI_BITFIELDS (todas las constantes están definidas por Windows). Cabe señalar que los mapas de bits de Windows se pueden comprimir en formatos RLE4 y RLE8, pero no se utilizan mucho. En el futuro solo se discutirá el primer caso de no compresión, es decir, la compresión dual es BI_RGB.

imagen biSizeImage

Especifica el número de bytes ocupados por los datos de mapa de bits reales, que también se puede calcular mediante la siguiente fórmula:

biSizeImage = biWidth ' * biHeight

Cabe señalar que biWidth ' en la fórmula anterior debe ser un múltiplo entero de 4 (por lo tanto, no biWidth, sino biWidth ', que significa mayor o igual que biWidth y el múltiplo entero más cercano de 4. Por ejemplo, si biWidth=240, entonces biwidth ' = 240 si biWidth = 241, biWidth ' = 244) Si biCompression es BI_RGB, esto puede ser cero.

biXPelsPerMeter

Especifica la resolución horizontal del dispositivo de destino en píxeles/metro. Cubriremos el concepto de resolución en detalle en la sección de impresión.

Medidor de pelvis dual

Especifique la resolución vertical del dispositivo de destino, las unidades son las mismas que las anteriores.

Bicolor

Especifica el número real de colores utilizados en esta imagen. Si el valor es cero, el número de colores utilizados es biBitCount elevado a la potencia 2.

Doble Importante

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 de colores. Por supuesto, esto es para archivos de mapa de bits que requieren una paleta de colores. Algunos mapas de bits, como los de color verdadero mencionados anteriormente, no requieren paleta. BITMAPINFOHEADER va seguido de datos de mapa de bits.

La paleta es en realidad una matriz, * * * con elementos biClrUsed (o 2 elementos de potencia biBitCount si el valor es cero). El tipo de cada elemento del array es una estructura RGBQUAD, que ocupa 4 bytes y se define de la siguiente manera:

typedef struct tagRGBQUAD{

byte rgbBlue//La parte azul de este color

Byte rgbGreen//La parte verde de este color

Byte rgbRed//La parte roja del color

Byte rgbReserved//Valor reservado

} RGBQUAD

La cuarta parte son los datos de la imagen real. Para mapas de bits con paleta, los datos de la imagen son los valores de índice de los píxeles en la paleta, y para los gráficos de color verdadero, los datos de la imagen son los valores reales de R, G, B, G y B. A continuación, presentaremos mapas de bits de dos colores, mapas de bits de 16 colores, mapas de bits de 256 colores y mapas de bits de color verdadero, respectivamente.

Para un mapa de bits de 2 colores, 1 bit puede representar el color del píxel (generalmente 0 representa negro, 1 representa blanco), por lo que un byte puede representar 8 píxeles.

Para un mapa de bits de 16 colores, 4 bits pueden representar el color de un píxel, por lo que un byte puede representar 2 píxeles.

Para un mapa de bits de 256 colores, un byte sólo puede representar 1 píxel.

Para mapas de color verdadero, tres bytes pueden representar 1 píxel. Vaya, eso ocupa mucho espacio. de ninguna manera. Quieres que los colores del mapa se vean más brillantes. Todo lo que se gana debe perderse.

Tenga en cuenta dos puntos:

1. El número de bytes en cada línea debe ser un múltiplo entero de 4. Si no, tendrás que compensarlo. Esto se mencionó en la introducción de biSizeImage.

2. En términos generales, los datos. Los archivos BMP se escriben de abajo hacia arriba y de izquierda a derecha. Es decir, lo primero que lees del archivo es el primer píxel a la izquierda de la fila inferior de la imagen, luego el segundo píxel a la izquierda... luego el primer píxel a la izquierda del penúltimo fila, y el segundo píxel... y así sucesivamente, terminando con el píxel más a la derecha en la fila superior.

Después de saber esto, puedes usar "rb" en modo binario para abrir la imagen png que deseas leer.

Archivo *fp

if (!(fp=open("Nombre de archivo", rb)))

printf("Error al abrir el archivo");

Después de abrirlo correctamente, el contenido del archivo se puede leer a través del puntero del archivo.