Red de conocimiento informático - Consumibles informáticos - Consejo de experto: escriba un programa para leer y escribir información del archivo "*.BMP".

Consejo de experto: escriba un programa para leer y escribir información del archivo "*.BMP".

#ifndef BMPRW_H

#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

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);

}