BMP格式图像的反色和变为灰度图代码

来源:互联网 发布:看板制作软件 编辑:程序博客网 时间:2024/05/17 23:08
#include "stdafx.h"#include <stdio.h>#include <windows.h>#include <math.h>#include <stdlib.h>int InvertImage(char *srcImage, char *destIMage, int iFlag){BITMAPFILEHEADER bmfHeader;BITMAPINFOHEADER bmiHeader;int i;FILE *pFile;if ((pFile = fopen(srcImage, "rb")) == NULL){printf("open bmp file error.");exit(-1);}//读取文件和Bitmap头信息fseek(pFile,0,SEEK_SET);fread(&bmfHeader,sizeof(BITMAPFILEHEADER),1,pFile);fread(&bmiHeader,sizeof(BITMAPINFOHEADER),1,pFile);//先不支持小于16位的位图int bitCount = bmiHeader.biBitCount;if (bitCount < 16){        printf("Image format is error!");exit(-1);}int srcW = bmiHeader.biWidth;//宽度,多少像素点    int srcH = bmiHeader.biHeight;//高度int lineSize = bitCount * srcW / 8;    //偏移量,windows系统要求每个扫描行按四字节对齐//int alignBytes = ((bmiHeader.biWidth * bitCount + 31) & ~31) / 8L//- bmiHeader.biWidth * bitCount / 8L;int srcLine = ((srcW * bitCount + 31) / 32) * 4;//int srcBufLine = srcLine * srcH;int srcBufSize = srcLine * srcH;BYTE *srcBuf = (BYTE *)malloc(srcBufSize);if(!srcBuf){printf("Malloc memory fail!");exit(-1);}for(i = 0; i < srcH; i++){fread(&srcBuf[i * srcLine], srcLine, 1, pFile);//fseek(pFile, alignBytes, SEEK_CUR);}//iFlag equal 1 表示灰度if(iFlag){for(i = 0; i < srcH; i++){for(int j = 0; j < srcW; j++){int k = (srcBuf[i * srcLine + j * bitCount / 8 + 0] + srcBuf[i * srcLine + j * bitCount / 8 + 1] + srcBuf[i * srcLine + j * bitCount / 8 + 2] ) / 3;srcBuf[i * srcLine + j * bitCount / 8 + 0] = k;srcBuf[i * srcLine + j * bitCount / 8 + 1] = k;srcBuf[i * srcLine + j * bitCount / 8 + 2] = k;}}}else{//反色for(i = 0; i < srcH; i++){for(int j = 0; j < srcW; j++){for(int k = 0; k < 3; k++){srcBuf[i * srcLine + j * bitCount / 8 + k] = abs(srcBuf[i * srcLine + j * bitCount / 8 + k] - 255);}}}}HFILE hfile = _lcreat(destIMage, 0);//写入文件头信息_lwrite(hfile,(LPCSTR)&bmfHeader,sizeof(BITMAPFILEHEADER));//写入Bitmap头信息_lwrite(hfile,(LPCSTR)&bmiHeader,sizeof(BITMAPINFOHEADER));//写入图像数据_lwrite(hfile,(LPCSTR)srcBuf, srcBufSize);    _lclose(hfile);fclose(pFile);free(srcBuf);return 0;}int main(int argc, char* argv[]){InvertImage("0.bmp", "image反色.bmp", 0);InvertImage("0.bmp", "image灰度.bmp", 1);//system("pause");return 0;}
<pre name="code" class="cpp">代码如果想在linux下运行,更改几个头文件,并且自己加上bmp格式头部的结构体,最后的写入文件该给库里面的IO就可以了
	
				
		
原创粉丝点击