深入 c语言 屏幕bmp,怎么用c语言把bmp文件里的白色像素转换为红色

满意答案

00e27ab806e4881f8254fe7ae8741834.png

西corefree

2018.10.08

00e27ab806e4881f8254fe7ae8741834.png

采纳率: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;

}

运行结果:

17adb975987b42028c508cd12a4d03a1.png

841f6dafaf3f99c351359e7aa061625c.png

00分享举报

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值