代码
本代码在vs2017上测试运行,由于工具不同可能要有所修改。 关于bmp 4字节对齐
#include <iostream>
#include <windows.h>
using namespace std;
typedef struct
{
BYTE b;
BYTE g;
BYTE r;
}RGB;
RGB imgOpr(RGB a)
{
RGB b;
b.b = 255-a.b;
b.g = 255-a.g;
b.r = 255-a.r;
return b;
}
int main()
{
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
FILE* pfin = fopen("D:/rotman.bmp", "rb");
FILE* pfout = fopen("D:/imgSave.bmp", "wb");
//Read the Bitmap file header;
fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pfin);
//Read the Bitmap info header;
fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pfin);
int height, weight;
height = infoHeader.biHeight;
weight = infoHeader.biWidth;
if (infoHeader.biBitCount == 24)
{
int size = height * weight;
RGB *img=new RGB[size];
fread(img, sizeof(RGB), size, pfin);
//对图片进行操作
int i;
for (i = 0; i<size; i++){
//对图片处理
img[i] = imgOpr(img[i]);
}
//将修改后的图片保存到文件
fwrite(&fileHeader, sizeof(fileHeader), 1, pfout);
fwrite(&infoHeader, sizeof(infoHeader), 1, pfout);
fwrite(img, sizeof(RGB), size, pfout);
}else {
cout << "非24位彩色图" << endl;
}
fclose(pfin);
fclose(pfout);
return 0;
}
结果
原图:看我头像
处理后图:
转化为灰度图
(实际上还是24位,没有颜色表,RGB占一个像元)处理代码:RGB imgOpr(RGB a)
{
RGB b;
int i = (a.b + a.g + a.r) / 3;
b.b = i;
b.g = i;
b.r = i;
return b;
}