C语言实现BMP图像处理(反色)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengxianghui01/article/details/85075994

 反色的实际含义是将 R、G、B 值反转。若颜色的量化级别是 256,则新图的 R、G、B 值为255 减去原图的 R、G、B 值。这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为伪彩色图)、和灰度图。针对不同种类有不同的处理。

#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>

int main(int* argc, char** argv)
{
	FILE* fp = fopen("./01.bmp", "rb");
	if (fp == 0)
		return 0;
	BITMAPFILEHEADER fileHead;
	fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);

	BITMAPINFOHEADER infoHead;
	fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp);
	int width = infoHead.biWidth;
	int height = infoHead.biHeight;
	int biCount = infoHead.biBitCount;

	RGBQUAD *pColorTable;
	pColorTable = new RGBQUAD[256];
	fread(pColorTable, sizeof(RGBQUAD), 256, fp);
	int pColorTableSize = 1024;

	int lineByte = (biCount*width / 8 + 3) / 4 * 4;
	unsigned char *pBmpBuf;
	pBmpBuf = new unsigned char[lineByte*height];
	fread(pBmpBuf, lineByte*height, 1, fp);
	fclose(fp);

	unsigned char *pBmpBuf1;
	pBmpBuf1 = new unsigned char[lineByte*height];
	for (int i = 0; i < width; ++i){
		for (int j = 0; j < height; ++j){
			*(pBmpBuf1 + lineByte*i + j) = 255;
		}
	}

	for (int i = 0; i < height; ++i){
		for (int j = 0; j < width; ++j){
			*(pBmpBuf1 + lineByte*i + j) = 255-*(pBmpBuf + lineByte*i + j);
		}
	}
	
	FILE* fop = fopen("./reverse.bmp", "wb");
	fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fop);
	fwrite(&infoHead, sizeof(BITMAPINFOHEADER), 1, fop);
	fwrite(pColorTable, sizeof(RGBQUAD), 256, fop);
	fwrite(pBmpBuf1, lineByte*height, 1, fop);
	fclose(fop);

	system("pause");
	return 0;
}

实验结果:

         原图                                          反转图

                     

实验结果分析:实验图为灰度图,且反转的方式并不是对调色板反转,而是直接对位图数据反转(即T=255-T),实验结果为负片

后续持续更新用C语言实现图像处理算法,敬请期待,欢迎关注。

猜你喜欢

转载自blog.csdn.net/fengxianghui01/article/details/85075994