【C++】使用CImage类将彩色图像转换成8位灰色图像
2015-04-20 16:53
288 查看
BOOL ImageToGray(CImage& imgSrc,CImage& imgDst) { int width = imgSrc.GetWidth(); int height = imgSrc.GetHeight(); if (!imgDst.IsNull()) { imgDst.Destroy(); } imgDst.Create(width,height,8,0);//图像大小与imgSrc相同,每个像素占1字节 if(imgDst.IsNull()) return FALSE; //为imgDst构造256阶灰度调色表 RGBQUAD ColorTab[256]; for(int i=0;i<256;i++) { ColorTab[i].rgbBlue = ColorTab[i].rgbGreen = ColorTab[i].rgbRed = i; } imgDst.SetColorTable(0,256,ColorTab); byte* pDataSrc = (byte*)imgSrc.GetBits(); //获取指向图像数据的指针 byte* pDataDst = (byte*)imgDst.GetBits(); int pitchSrc = imgSrc.GetPitch(); //获取每行图像占用的字节数 +:top-down;-:bottom-up DIB int pitchDst = imgDst.GetPitch(); int bitCountSrc = imgSrc.GetBPP()/8; // 获取每个像素占用的字节数 int bitCountDst = imgDst.GetBPP()/8; if((bitCountSrc!=3)||(bitCountDst!=1)) return FALSE; int tmpR,tmpG,tmpB,avg; for(int i=0;i<width;i++) { for(int j=0;j<height;j++) { tmpR = *(pDataSrc+pitchSrc*j+i*bitCountSrc); tmpG = *(pDataSrc+pitchSrc*j+i*bitCountSrc+1); tmpB = *(pDataSrc+pitchSrc*j+i*bitCountSrc+2); avg = (int)(tmpR+tmpG+tmpB)/3; *(pDataDst+pitchDst*j+i*bitCountDst) = avg; } } return TRUE; }
相关文章推荐
- 使用GDI+将24位真彩色图像转换为8位灰度图像
- 使用GDI+将24位真彩色图像转换为8位灰度图像
- 使用 Java 进行图像处理 - 将彩色图像转换为灰度图
- C++ OpenCV 实现RGB彩色图像转化成灰度图像再转换成二值图像
- 使用ffmpeg进行图像格式转换以及图像缩放/sws_scale/linux/c++/c/rgb-yuv420
- 使用ffmpeg进行图像格式转换以及图像缩放/sws_scale/linux/c++/c/rgb-yuv420
- 使用ffmpeg进行图像格式转换以及图像缩放/sws_scale/linux/c++/c/rgb-yuv420
- 使用ffmpeg进行图像格式转换以及图像缩放/sws_scale/linux/c++/c/rgb-yuv420
- matlab实现将彩色图像转换成灰色图像的方法
- Matlab图像处理:使用函数将彩色图转换为灰度图
- OpenCV学习笔记二:灰色图像转换成彩色图像 非CV_GRAY2RGB
- 图像处理--RGB到HSI的彩色转换--图像分割(MFC VC++)
- C++使用opencv实现彩色直方图计算
- 使用openCV把视频转换成一组图像或者从一组图像转换成视频
- Caffe使用:如何将一维数据或其他非图像数据转换成lmdb
- 【转载】使用CSS将图片转换成黑白(灰色、置灰)
- 图像配准 - 三张灰度图合成彩色图 ECC算法 OpenCV C++/Python实现
- 尽量使用C++风格的类型转换
- C/C++使用心得:enum与int的相互转换
- C/C++使用心得:enum与int的相互转换