Consejo de experto: escriba un programa para leer y escribir información del archivo "*.BMP".
#Define BMPRW_H
Estructura Typedef {//Longitud 12 bytes.
//Bftype corto//se fija en "BM", VC no puede leer corto, por lo que se omite.
int bfSize//El tamaño del archivo de mapa de bits, en bytes.
Short bfreed 1; //Palabra reservada del archivo de mapa de bits, debe ser 0.
BfReserved2 corto // Palabra reservada del archivo de mapa de bits, debe ser 0.
int bfOffBits//La posición inicial de los datos del mapa de bits, representada por el desplazamiento del encabezado del archivo de mapa de bits, en bytes.
} BITMAPFILEHEADER
Estructura Typedef {//Longitud 40 bytes
int biSize//El número de bytes que ocupa esta estructura tiene una longitud de 40 bytes.
int double width; //El ancho del mapa de bits, en píxeles.
int biHeight//La altura del mapa de bits, en píxeles.
Biplano corto; //El dispositivo objetivo debe ser de nivel 1.
Short biBitCount //El número de bits necesarios para cada píxel debe ser uno de 1 (bicolor), 4 (16 colores), 8 (256 colores) o 24 (color verdadero).
int dual listening; //El tipo de compresión del mapa de bits debe ser uno de 0 (sin compresión), 1 (tipo de compresión BI_RLE8) o 2 (tipo de compresión BI_RLE4).
int biSizeImage//El tamaño del mapa de bits, en bytes.
int biXPelsPerMeter//La resolución horizontal del mapa de bits, píxeles por metro
int biYPelsPerMeter//La resolución vertical del mapa de bits, píxeles por metro
int biClrUsed//El número de colores en la tabla de colores realmente utilizados por el mapa de bits.
int biClrImportant//El número de colores importantes en la visualización del mapa de bits.
} BITMAPINFOHEADER
Estructura Typedef {// El color verdadero de 24 bits no tiene esta estructura, la longitud de la imagen en escala de grises de 256 niveles es 256*4 bytes.
char rgbBlue//Brillo del azul (el rango de valores es 0-255)
char rgbGreen//Brillo del verde (el rango de valores es 0-255)
char rgbRed//El brillo del rojo (el rango de valores es 0-255)
char rgbReserved//Reservado, debe ser 0.
} RGBQUAD
void ColorBmpR(char*, unsigned char *); //Lectura de imagen bmp en color
void ColorBmpW(char*, char*, unsigned char *); //Escritura de imagen bmp en color
void GrayBmpR (char*, unsigned char *); //Lectura de imagen bmp en escala de grises
void GrayBmpW (char*, char*, unsigned char *); //Escritura de imagen bmp en escala de grises
#endif
////////////////// ///// //////////////////////////////////////
#Contiene "stdio. h"
#Incluye " stdlib.h "
#Incluye "Common.h"
#Incluye " BmpRW.h "
/*
Copyright: Li Weiwei
VER 2.00
Función: Leer una imagen bmp en escala de grises de 256 en la memoria.
Entrada: puntero de nombre de archivo bmp, puntero de datos de imagen en la memoria
Salida: Ninguna
*/
void GrayBmpR(char * fn, unsigned char *pImage)
{
encabezado del archivo de mapa de bits * pbm phh; // puntero del encabezado del archivo bmp
BITMAPINFOHEADER * pbmpi// Puntero del encabezado del archivo bmp
Unsigned char * pbitstr// puntero de datos del archivo bmp
int I = 0;
//Lee el encabezado del archivo bmp en *pbmpfh.
ARCHIVO *rfile = fopen(fn, " r b ");
pbm phh = (encabezado del archivo de mapa de bits *)malloc(sizeof(encabezado del archivo de mapa de bits)); >if(!pbmpfh)
{
printf("pbm phh sin memoria");
}
fseek(rfile , sizeof(short), SEEK_SET);
fread(pbm phh, sizeof(BITMAPFILEHEADER), 1, rfile);
//Lee el encabezado de información del archivo bmp en *pbmpi .
pbm pi =(BITMAPINFOHEADER *)malloc(sizeof(BITMAPINFOHEADER));
if (!pbmpi)
{
printf ("pbmpi sin memoria");
}
fseek(rfile, sizeof(bitmapfile header) sizeof(short), SEEK_SET);
fread ( pbmpi, sizeof(BITMAPINFOHEADER), 1, rfile);
//Leer datos del archivo bmp en *pbitstr.
pbitstr =(unsigned char *)malloc(IMAGEN _ TAMAÑO
If (!pbitstr)
{
printf( "pbitstr sin memoria");
}
fseek(rfile, pbm phh-gt; bfOffBits, SEEK_SET);
fread(pbitstr, IMAGE_SIZE, 1, rfile);
fclose(rfile);
//Almacena los datos en *pbitstr en *pImage.
for(I = 0; i ltIMAGE _ TAMAÑOi )
{
*(pImage I)= *(pbitstr I);
}
//Liberar espacio de memoria no utilizado
Gratis (pbitstr);
Gratis (pbm pi);
Gratis ( pbm phh);
}
/*
Copyright: Li Weiwei
VER 2.00
Función: Lee una imagen bmp en color verdadero de 24 bits en la memoria.
Entrada: puntero de nombre de archivo bmp, puntero de datos de imagen en la memoria
Salida: Ninguna
*/
void ColorBmpR(char * fn, unsigned char *pImage)
{
encabezado del archivo de mapa de bits * pbm phh; // puntero del encabezado del archivo bmp
BITMAPINFOHEADER * pbmpi// Puntero del encabezado del archivo bmp
Unsigned char * pbitstr// puntero de datos del archivo bmp
int I = 0;
//Lee el encabezado del archivo bmp en *pbmpfh.
ARCHIVO *rfile = fopen(fn, " r b ");
pbm phh = (encabezado del archivo de mapa de bits *)calloc(1, tamaño de (encabezado del archivo de mapa de bits)
if(!pbmpfh)
{
printf("pbm phh sin memoria");
}
fseek ( rfile, sizeof(short), SEEK_SET);
fread(pbm phh, sizeof(BITMAPFILEHEADER), 1, rfile);
//Leer el encabezado de información del archivo bmp *pbmpi .
pbm pi =(BITMAPINFOHEADER *)calloc(1, sizeof(BITMAPINFOHEADER));
if (!pbmpi)
{
printf("pbmpi sin memoria");
}
fseek(rfile, sizeof(bitmapfile header) sizeof(short), SEEK_SET);
fread(pbmpi, sizeof(BITMAPINFOHEADER), 1, rfile);
//Leer datos del archivo bmp en *pbitstr.
pbitstr = (unsigned char*) calloc(IMAGE_SIZE*3, sizeof(char));
if (!pbitstr)
{
printf("pbitstr sin memoria");
}
fseek(rfile, pbm phh-gt; bfOffBits, SEEK_SET);
fread (pbitstr, IMAGE_SIZE*3, 1, rfile);
fclose(rfile);
//Almacena los datos en *pbitstr en *pImage.
for(I = 0; i ltIMAGEN _ TAMAÑO * 3; i )
{
*(pImage I)= *(pbitstr I);
}
//Liberar espacio de memoria no utilizado
Gratis (pbitstr);
Gratis (pbm pi);
Gratis (pbm phh);
}
/*
Copyright: Li Weiwei
VER 2.00 p>
Función: Escribe una imagen bmp en escala de grises de 256 en un archivo.
Entrada: puntero de nombre de archivo de plantilla en escala de grises, puntero de nombre de archivo bmp que se escribirá, puntero de datos de imagen en la memoria.
Salida: Ninguna
*/
void GrayBmpW(char *rfn, char *wfn, unsigned char *pImage)
{
BITMAPINFOHEADER * pbmpi// puntero de encabezado de archivo bmp
encabezado de archivo de mapa de bits * pbm phh; // puntero de encabezado de archivo bmp
RGBQUAD * pbmprgb// ajuste de archivo bmp Puntero de muestra
Caracteres sin firmar * pbitstr// puntero de datos del archivo bmp
encabezado bmp_corto = 0x4D42//encabezado del archivo bmp
final bmp_corto = 0x0000 // sufijo del archivo bmp
int I = 0;
FILE *rfile = fopen(rfn, "r b"); //Puntero del archivo bmp de plantilla
ARCHIVO *wfile = fopen(wfn, "w b "); //Generar puntero de archivo bmp
//Escribir encabezado bmp en el archivo.
fseek(wfile, 0, SEEK _ SET);
fwrite( amp; bmp_header, 1, sizeof(short), wfile); Escriba el archivo de encabezado del archivo bmp de plantilla en el archivo generado.
pbm phh =(encabezado del archivo de mapa de bits *)malloc(sizeof(encabezado del archivo de mapa de bits));
if (!pbmpfh)
{
printf("pbm phh sin memoria");
}
fseek(rfile, sizeof(short), SEEK_SET);
fread(pbm phh , 1, tamaño de (BITMAPFILEHEADER), rfile);
fseek(wfile, tamaño de (corto), SEEK_SET);
fwrite(pbm phh, 1, tamaño de (BITMAPFILEHEADER) ), wfile);
//Escriba el archivo de encabezado de información del archivo bmp de plantilla en el archivo generado.
pbm pi =(BITMAPINFOHEADER *)malloc(sizeof(BITMAPINFOHEADER));
if (!pbmpi)
{
printf ("pbmpi sin memoria");
}
fseek(rfile, sizeof(bitmapfile header) sizeof(short), SEEK_SET);
fread ( pbmpi, 1, tamaño de (BITMAPINFOHEADER), rfile);
fseek(wfile, tamaño de (encabezado del archivo de mapa de bits) tamaño de (corto), SEEK_SET); (BITMAPINFOHEADER),wfile);
//Escribe la paleta bmp de la plantilla en el archivo de compilación.
pbmprgb = (RGBQUAD*) calloc(256, tamaño de(RGBQUAD));
if (!pbmprgb)
{
printf("pbmprgb sin memoria");
}
fseek(rfile, sizeof(BITMAPINFOHEADER) sizeof(bitmapfile header) sizeof(short), SEEK_SET);
fread(pbmprgb, 256, sizeof(RGBQUAD), rfile);
fclose(rfile); //Cerrar el archivo de plantilla
fseek(wfile, sizeof(BITMAPINFOHEADER) sizeof(bitmapfile header) sizeof(short), SEEK_SET);
fwrite(pbmprgb, sizeof(RGBQUAD), 256, wfile);
//Escribe los datos de la imagen pImage Introduce el archivo generado.
fseek(wfile,pbm phh-gt;bfOffBits,SEEK_SET);
pbitstr =(unsigned char *)malloc(IMAGE_SIZE);
if(! pbitstr)
{
printf("pbitstr sin memoria");
}
for(I = 0 ;IltIMAGE_SIZEi )
{
*(pbitstr I)= *(pImage I);
}
fwrite( pbitstr, IMAGE_SIZE, 1, wfile);
Gratis (pbitstr);
//Escribe el sufijo bmp en el archivo
fseek(wfile, 0, SEEK _ END);
fwrite(amp;bmp_end,1,sizeof(short),wfile);
fclose(wfile);//Cerrar el archivo de compilación
//Liberar espacio de memoria no utilizado
Gratis (pbm prgb);
Gratis (pbm pi);
Gratis (pbm phh);
p >
}
/*
Copyright: Li Weiwei
VER 2.00
Función: convertir un color verdadero de 24 bits Las imágenes bmp se escriben en archivos.
Entrada: puntero de nombre de archivo de plantilla de color verdadero de 24 bits, puntero de nombre de archivo bmp para escribir, puntero de datos de imagen en la memoria.
Salida: Ninguna
*/
void ColorBmpW(char *rfn, char *wfn, unsigned char *pImage)
{
encabezado del archivo de mapa de bits * pbm phh; // puntero del encabezado del archivo bmp
BITMAPINFOHEADER * pbmpi // puntero del encabezado del archivo bmp
Unsigned char * pbitstr // Archivo bmp puntero de datos
encabezado bmp _ corto = 0x4D42 // encabezado del archivo bmp
int I = 0;
FILE *rfile = fopen(rfn, " r b " ); //Puntero de archivo bmp de plantilla
FILE *wfile = fopen(wfn, "w b "); //Generar puntero de archivo bmp
//Escribir documento de encabezado bmp.
fseek(wfile, 0, SEEK _ SET);
fwrite( amp; bmp_header, 1, sizeof(short), wfile); Escriba el archivo de encabezado del archivo bmp de plantilla en el archivo generado.
pbm phh =(encabezado del archivo de mapa de bits *)malloc(sizeof(encabezado del archivo de mapa de bits));
if (!pbmpfh)
{
printf("Memoria insuficiente");
}
fseek(rfile, sizeof(short), SEEK_SET);
fread(pbm phh, 1, tamaño de (BITMAPFILEHEADER), rfile);
fseek(rfile, tamaño de (corto), SEEK_SET);
fwrite(pbm phh, 1, tamaño de (BITMAPFILEHEADER), wfile);
//Escriba el archivo de encabezado de información del archivo bmp de la plantilla en el archivo generado.
pbm pi =(BITMAPINFOHEADER *)malloc(sizeof(BITMAPINFOHEADER));
if (!pbmpi)
{
printf ("Memoria insuficiente");
}
fseek(rfile, sizeof(bitmapfile header) sizeof(short), SEEK_SET);
fread( pbmpi, 1, tamaño de (BITMAPINFOHEADER), rfile);
fseek(wfile, tamaño de (encabezado de archivo de mapa de bits) tamaño de (corto), SEEK_SET);
fwrite(pbmpi, 1, tamaño de (BITMAPINFOHEADER) ), wfile);
//Escribe los datos de la imagen en el archivo generado.
pbitstr = (unsigned char*) calloc(IMAGE_SIZE*3, sizeof(char));
if (!pbitstr)
{
printf("Memoria insuficiente");
}
//Escribe los datos en *pImage en *pbitstr
for(I = 0; i ltIMAGEN _ TAMAÑO * 3; i )
{
*(pbitstr I)= *(pImagen I);
}
fseek(wfile, pbm phh-gt; bfOffBits, SEEK_SET);
fwrite(pbitstr, IMAGE_SIZE*3, 1, wfile);
fclose(wfile);
//Liberar espacio de memoria no utilizado
Gratis (pbitstr);
Gratis (pbm pi);
Gratis (pbm phh); p>
}