我正在尝试编写一个函数来读取BMP文件,然后复制它。我像往常一样将图像头读取到一个结构,并将像素值复制到rgb矩阵。
我正在构建的用于编写BMP文件的函数提供了正确的图像宽度/高度和大小,但图像是全黑的,并且当像素值都不正确时(我通过使用
xxd
)
下面是编写BMP文件的函数:
void writeBMP(BMPFILEHEADER *headerData,BMPINFOHEADER *headerInfo, int values[headerInfo->width*headerInfo->height]) {
FILE *out;
out = fopen("example.bmp", "wb");
fwrite(headerData, sizeof(char), sizeof(BMPFILEHEADER), out);
fseek(out, 14, SEEK_SET);
fwrite(headerInfo, sizeof(char), sizeof(BMPINFOHEADER), out);
fseek(out, 54, SEEK_SET);
fwrite(values, sizeof(char), headerInfo->imagesize, out);
fclose(out);
}
我查过了
values
(这是我使用PrimTF存储像素数据的地方,像素值与原始图像像素匹配。但看起来像是一条线
fwrite(values, sizeof(char), headerInfo->imagesize, out)
正在将错误的数据写入文件。
编辑:我正在添加有关代码的其他详细信息
读取像素数据的函数:
RGBmatrix readPixels(char *fileName, BMPFILEHEADER *header, BMPINFOHEADER *info) {
FILE *fp;
int **matR, **matG, **matB;
int RGBvalues[info->width][info->height];
RGBmatrix values;
matR = allocateRGB(matR, info->width, info->height);
matG = allocateRGB(matG, info->width, info->height);
matB = allocateRGB(matB, info->width, info->height);
fp = fopen(fileName, "rb");
if(fp==NULL) {
printf("Can't open file\n");
}
fseek(fp, header->offset, SEEK_SET);
for(int i = 0; i<info->width; i++) {
for(int j=0; j<info->height;j++) {
fread(&RGBvalues[i][j], 3, 1, fp);
}
}
for(int i=0; i<info->width; i++) {
for(int j=0; j<info->height; j++) {
matB[i][j] = RGBvalues[i][j] & 0xff;
matG[i][j] = (RGBvalues[i][j]>>8) & 0xff;
matR[i][j] = (RGBvalues[i][j]>>16) & 0xff;
}
}
values.R = matR;
values.G = matG;
values.B = matB;
return values;
}
保存BMP数据的结构:
typedef struct RGBmatrix {
int **R, **G, **B;
}RGBmatrix;
typedef struct BMPFILEHEADER {
short int magicNumber;
int bmpfSize;
short int reserved1;
short int reserverd2;
int offset;
}BMPFILEHEADER;
typedef struct BMPINFOHEADER {
unsigned int size;
int width, height;
unsigned short int planes;
unsigned short int bits;
unsigned int compression;
unsigned int imagesize;
int xresolution, yresolution;
unsigned int ncolours;
unsigned int importantcolours;
}BMPINFOHEADER;
我的主要功能:
int main(int argc, char *argv[]) {
BMPFILEHEADER headerData;
BMPINFOHEADER headerInfo;
FILE *fp;
char fileName[20];
strcpy(fileName, argv[1]);
readBMPHeader(fileName, &headerData, &headerInfo);
RGBmatrix values = readPixels(fileName, &headerData, &headerInfo);
int rgbModifiedValues[headerInfo.width*headerInfo.height];
writeBMP(&headerData, &headerInfo, rgbModifiedValues);
return 0;
}