满意答案
西corefree
2018.10.08
采纳率:48% 等级:7
已帮助:11人
代码如下:#include
#include
#include
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
// 保存位图
void SaveBitmap(
PBITMAPFILEHEADER pFileHdr,
PBITMAPINFOHEADER pInfoHdr,
LPRGBQUAD pRGBQUAD,
size_t paletteNum,
const unsigned char *bmpData,
size_t bmpDataSize,
const char *file)
{
FILE *pf = fopen(file, "wb");
fwrite(pFileHdr, sizeof(BITMAPFILEHEADER), 1, pf);
fwrite(pInfoHdr, sizeof(BITMAPINFOHEADER), 1, pf);
if (pRGBQUAD != NULL) {
fwrite(pRGBQUAD, paletteNum * sizeof(RGBQUAD), 1, pf);
}
fwrite(bmpData, bmpDataSize, 1, pf);
fclose(pf);
}
// 转换位图,将白色像素转换为红色
void ConvertBitmap(const char *file, const char *new_file)
{
FILE *pf = fopen(file, "rb");
// 读取文件头
BITMAPFILEHEADER fileHeader;
memset(&fileHeader, 0, sizeof(fileHeader));
fread(&fileHeader, sizeof(fileHeader), 1, pf);
// 读取信息头
BITMAPINFOHEADER infoHeader;
memset(&infoHeader, 0, sizeof(infoHeader));
fread(&infoHeader, sizeof(infoHeader), 1, pf);
switch (infoHeader.biBitCount) {
// 处理24位位图
case 24: {
// 读取位图数据
fseek(pf, fileHeader.bfOffBits, SEEK_SET);
unsigned char *bmpData = (unsigned char *)malloc(infoHeader.biSizeImage);
fread(bmpData, infoHeader.biSizeImage, 1, pf);
// 修改位图,将白色像素转换为红色像素,这里只是简单的替换
int widthBytes = WIDTHBYTES(infoHeader.biWidth * infoHeader.biBitCount);
for (int i = 0; i
unsigned char *line = bmpData + widthBytes * i;
for (int j = 0; j
int offset = j * (infoHeader.biBitCount / 8);
if (line[offset] == 0xff &&
line[offset + 1] == 0xff &&
line[offset + 2] == 0xff) {
line[offset] = 0x00;
line[offset + 1] = 0x00;
line[offset + 2] = 0xff;
}
}
}
// 保存
SaveBitmap(&fileHeader, &infoHeader, NULL, 0, bmpData, infoHeader.biSizeImage, new_file);
free(bmpData);
break;
}
// 处理 8位,4位位图
case 8:
case 4: {
// 读取调色板数据
long paletteNum = (long)pow(2.0, infoHeader.biBitCount);
RGBQUAD *pRGBQUAD = (RGBQUAD *)malloc(paletteNum * sizeof(RGBQUAD));
fread(pRGBQUAD, paletteNum * sizeof(RGBQUAD), 1, pf);
// 读取位图数据
fseek(pf, fileHeader.bfOffBits, SEEK_SET);
unsigned char *bmpData = (unsigned char *)malloc(infoHeader.biSizeImage);
fread(bmpData, infoHeader.biSizeImage, 1, pf);
// 查找颜色索引
BYTE whiteIdx = 0;
BYTE redIdx = 0;
for (long i = 0; i
if (pRGBQUAD[i].rgbRed == 0xff &&
pRGBQUAD[i].rgbGreen == 0xff &&
pRGBQUAD[i].rgbBlue == 0xff) {
whiteIdx = i;
}
if (pRGBQUAD[i].rgbRed == 0xff &&
pRGBQUAD[i].rgbGreen == 0x00 &&
pRGBQUAD[i].rgbBlue == 0x00) {
redIdx = i;
}
}
// 修改位图,将白色像素转换为红色像素,这里只是简单的替换
int widthBytes = WIDTHBYTES(infoHeader.biWidth * infoHeader.biBitCount);
for (int i = 0; i
unsigned char *line = bmpData + widthBytes * i;
for (int j = 0; j
if (infoHeader.biBitCount == 8) {
if (line[j] == whiteIdx) {
line[j] = redIdx;
}
}
else if (infoHeader.biBitCount == 4) {
if ((line[j] & 0x0f) == whiteIdx) {
line[j] = line[j] & 0xf0 | redIdx;
}
if (((line[j] >> 4) & 0x0f) == whiteIdx) {
line[j] = (line[j] & 0x0f) | ((redIdx <
}
}
}
}
// 保存
SaveBitmap(&fileHeader, &infoHeader, pRGBQUAD, paletteNum, bmpData, infoHeader.biSizeImage, new_file);
free(bmpData);
free(pRGBQUAD);
break;
}
} // end of switch
fclose(pf);
}
int main()
{
ConvertBitmap("images/test24.bmp", "images/test24_new.bmp");
ConvertBitmap("images/test16.bmp", "images/test16_new.bmp");
ConvertBitmap("images/test256.bmp", "images/test256_new.bmp");
ConvertBitmap("images/test_bin.bmp", "images/test_bin_new.bmp");
system("pause");
return 0;
}
运行结果:
00分享举报