Héroe, ¿puedes decirme cómo leer el ancho y el alto de un png binario usando el lenguaje C? ¡Gracias! ! !
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; p>
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 p >
} 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.