所以我用单个数组(B,G,R)实现了代码。
我需要你的帮助。
BmpProcess.h
#include <stdio.h>
#include <stdlib.h>
#pragma pack(2) //The header needs to be 2 byte aligned.
typedef struct /**** BMP file header structure ****/
{
unsigned short bfType; /* Magic number for file */
unsigned int bfSize; /* Size of file */
unsigned short bfReserved1; /* Reserved */
unsigned short bfReserved2; /* ... */
unsigned int bfOffBits; /* Offset to bitmap data */
} BITMAPFILEHEADER;
#pragma pack()
typedef struct /**** BMP file info structure ****/
{
unsigned int biSize; /* Size of info header */
int biWidth; /* Width of image */
int biHeight; /* Height of image */
unsigned short biPlanes; /* Number of color planes */
unsigned short biBitCount; /* Number of bits per pixel */
unsigned int biCompression; /* Type of compression to use */
unsigned int biSizeImage; /* Size of image data */
int biXPelsPerMeter; /* X pixels per meter */
int biYPelsPerMeter; /* Y pixels per meter */
unsigned int biClrUsed; /* Number of colors used */
unsigned int biClrImportant; /* Number of important colors */
} BITMAPINFOHEADER;
typedef struct /**** Colormap entry structure ****/
{
unsigned char rgbBlue; /* Blue value */
unsigned char rgbGreen; /* Green value */
unsigned char rgbRed; /* Red value */
unsigned char rgbReserved; /* Reserved */
} RGBQUAD;
typedef struct{
BITMAPFILEHEADER hf;
BITMAPINFOHEADER hInfo;
unsigned char * B;
unsigned char * G;
unsigned char * R;
unsigned char ** dB;
unsigned char ** dG;
unsigned char ** dR;
int X0, Y0, X1, Y1 = 0;
int ImgSize;
void openBMP(const char * filename);
void writeBMP(const char *filename);
void freeBGR();
} BMPSTRUCT;
BmpProcess.c
#include "BmpProcess.h"
void BMPSTRUCT::openBMP(const char *filename){
FILE *f;
f = fopen(filename, "rb");
if (f == NULL) return ;
fread(&hf, sizeof(BITMAPFILEHEADER), 1, f);
fread(&hInfo, sizeof(BITMAPINFOHEADER), 1, f);
ImgSize = hInfo.biWidth * hInfo.biHeight;
X1 = hInfo.biWidth;
Y1 = hInfo.biHeight;
B = (unsigned char *)malloc(ImgSize);
G = (unsigned char *)malloc(ImgSize);
R = (unsigned char *)malloc(ImgSize);
for (int i = 0; i < ImgSize; i++){
B[i] = fgetc(f);
G[i] = fgetc(f);
R[i] = fgetc(f);
}
dB = (unsigned char **)malloc(hInfo.biHeight);
dG = (unsigned char **)malloc(hInfo.biHeight);
dR = (unsigned char **)malloc(hInfo.biHeight);
for (int i = 0 ; i < hInfo.biHeight; i++){
*(dB+i) = (unsigned char *)malloc(hInfo.biWidth);
*(dG+i) = (unsigned char *)malloc(hInfo.biWidth);
*(dR+i) = (unsigned char *)malloc(hInfo.biWidth);
}
fclose(f);
}
void BMPSTRUCT::writeBMP(const char *filename){
FILE *f = NULL;
f = fopen(filename, "wb");
fwrite(&hf, sizeof(BITMAPFILEHEADER), 1, f);
fwrite(&hInfo, sizeof(BITMAPINFOHEADER), 1, f);
for (int i = 0; i < ImgSize + hInfo.biHeight; i++){
fputc(B[i],f);
fputc(G[i],f);
fputc(R[i],f);
}
fclose(f);
}
void BMPSTRUCT:: freeBGR(){
for (int i = 0 ; i < hInfo.biWidth; i++){
free(dB[i]);
dB[i] = NULL;
free(dG[i]);
dG[i] = NULL;
free(dR[i]);
dR[i] = NULL;
}
free(dB);
dB=NULL;
free(dG);
dG=NULL;
free(dR);
dR=NULL;
free(B);
B=NULL;
free(G);
G=NULL;
free(R);
R=NULL;
}
复制.c
#include "BmpProcess.c"
int main(){
BMPSTRUCT bmp;
bmp.openBMP("sample1.bmp");
bmp.writeBMP("output.bmp");
bmp.freeBGR();
return 0;
}