将RGB彩色图像转为8位的索引颜色

先定义一个宏

//   Greyscale conversion
#define GREY(r, g, b) (BYTE)(((WORD)r * 77 + (WORD)g * 150 + (WORD)b * 29) >> 8
//#define GREY(r, g, b) (BYTE)(((WORD)r * 169 + (WORD)g * 256 + (WORD)b * 87) >> 9)
// Grayscale, 将RGB转为8bit
void GDIPlusImage::IPFuncGrayscale()
{Bitmap* ima = this->m_pBitmap;if (!ima) {return;}// Build new 8bpp greyscale bitmapint width = ima->GetWidth();int height = ima->GetHeight();Rect rect(0, 0, width, height);BitmapData bitmapData_org, bitmapData_new;Bitmap *pGrayImg = new Bitmap(width, height,PixelFormat8bppIndexed); ColorPalette *pal = (ColorPalette *)malloc(sizeof(ColorPalette)+256*sizeof(ARGB));pal->Count = 256;pal->Flags = 2;for (int i = 0; i < 256; i++){pal->Entries[i] = Color::MakeARGB(255,i,i,i);}pGrayImg->SetPalette(pal);pGrayImg->LockBits(&rect,ImageLockModeWrite,PixelFormat8bppIndexed,&bitmapData_new);                         //锁定位图,然后对其进行读写内存操作,相关信息保存到BitmapData中Status iSucess = ima->LockBits(&rect,ImageLockModeRead | ImageLockModeWrite,ima->GetPixelFormat() ,&bitmapData_org);BYTE *_pixels = (BYTE*)bitmapData_org.Scan0;    //原图rect区域内存位置的起始指针,以BYTE作为单元类型BYTE *_newpixles = (BYTE*)bitmapData_new.Scan0;  //目标位图rect区域的起始指针BYTE _grey;// build pixlesswitch(ima->GetPixelFormat())                 //像素格式不同,灰度化处理方式也不同{case PixelFormat24bppRGB:{int _strideoff24 = bitmapData_org.Stride - 3*width;int _strideoff8 = bitmapData_new.Stride - width;//  灰度化for (int i=0; i < height; i++){for (int j=0;j < width;j++){            BYTE* _pixels_b;        //bBYTE* _pixels_g;     //gBYTE* _pixels_r;     //r_pixels_b = _pixels++;  //blue_pixels_g = _pixels++;  //green_pixels_r = _pixels++;  //red_grey = GREY(*_pixels_r, *_pixels_g, *_pixels_b); *_newpixles = _grey;    //根据红绿蓝求出此像素的灰度值_newpixles += 1;}_pixels += _strideoff24;_newpixles += _strideoff8;}}break;case PixelFormat32bppARGB:{int _strideoff32 = bitmapData_org.Stride - 4*width;int _strideoff8 = bitmapData_new.Stride - width;//  灰度化for (int i=0;i<height;i++){for (int j=0;j<width;j++){         BYTE* _pixels_b;BYTE* _pixels_g;        BYTE* _pixels_r;        _pixels_b = _pixels++;  //blue_pixels_g = _pixels++;  //green_pixels_r = _pixels++;  //red_grey = GREY(*_pixels_r, *_pixels_g, *_pixels_b); *_newpixles = _grey;_pixels ++;                //忽略alpha位置_newpixles += 1;}_pixels += _strideoff32;_newpixles += _strideoff8;}}break;case PixelFormat8bppIndexed:  // 因为比Clone(rect,ima->GetPixelFormat())要快{//  直接复制memcpy(_newpixles, _pixels, height * bitmapData_new.Stride);}break;default:break;}ima->UnlockBits(&bitmapData_org);pGrayImg->UnlockBits(&bitmapData_new);free (pal);           // 释放掉malloc开辟的空间m_pBitmap = pGrayImg;
}

GDIPlus灰度化图像相关推荐

  1. 2种图像增强方法:图像点运算和图像灰度化处理

    摘要:本文主要讲解图像点运算的灰度化处理,详细介绍常用的灰度化处理方法,并分享了图像颜色空间相互转换,以及三种灰度转换算法的实现. 本文分享自华为云社区<[Python从零到壹] 四十三.图像增 ...

  2. 图像灰度化的三种常见方法源码

    图像灰度化是图像处理很基础的一部分,在这里给出图像灰度化的三种常见方法的M源码,以供大家参考~ 平均值法,最大值法,加权平均值法 function f=MyGrayProcessing(Img) [m ...

  3. Unity3D Shader系列之UI Image灰度化

    目录 1.灰度化是什么 2.灰度值计算方法 3.灰度化的目的 4.Shader实现 5.参考文章 在<OpenCV for Unity学习笔记(1)--Mat及灰度化图像>我们看到,使用O ...

  4. html5图片灰度显示,HTML5 组件Canvas实现图像灰度化

    HTML5发布已经有很长一段时间了,一直以来从来没有仔细的看过,过年刚来随便看看 发现HTML5中的Canvas组件功能是如此的强大,不怪很多牛人预言Flash已死,死不死 不是我要关心的,我关心的C ...

  5. opencv图像灰化_opencv读入图像、灰度化、归一化、向量化

    平台:win7+opencv2.4.4+vs2008 功能:实现对图像的读入.灰度化.归一化和向量化. 代码: //这里的头文件都是vs2008的,与vc6.0有多不同 #include #inclu ...

  6. Python-OpenCV 处理图像(七):图像灰度化处理

    为了加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像. 0x00. 灰度图 灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度. 灰度图像与黑 ...

  7. Python-OpenCV 处理图像(六)(七)(八):对象识别 图像灰度化处理 图像二值化处理

    为了加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像. 0x00. 灰度图 灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度. 灰度图像与黑 ...

  8. [Python图像处理] 三十一.图像点运算处理两万字详细总结(灰度化处理、阈值化处理)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. [Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. mysql库操作、表操作
  2. [PHP] 项目实践中使用的IOC容器思想
  3. mysql初体验学习笔记_【MySQL】mycli初体验
  4. ios android 字体颜色,iOS-修改导航栏文字字体和颜色
  5. 软件工程学习总结(1)——软件测试工具详解
  6. 互利网上数字金融典型场景: 网络借贷
  7. Python常用正则表达式语法和写法
  8. 算法:数组找出2个只出现一次的数字(其他元素出现两次)
  9. KSZ9897 switch 交换机
  10. 教程 参数设置_呼吸机的使用方法教程及参数设置
  11. lzg_ad:EWF原理详解
  12. w7计算机文件夹打开怎么设置密码,win7电脑文件夹怎么设置密码
  13. ansible进阶(五)-handlers-任务发生更改时触发操作
  14. mac 笔记本命令行使用技巧
  15. ColBERT(2020SIGIR)
  16. Python项目-----外星人大战
  17. C++ 进制转换器:二进制、十进制、十六进制
  18. 蓝湖切图后如何做成html,如何使用蓝湖 sketch for Mac设置切图?
  19. 本地ie打开html布局乱,网页设计:浏览器在兼容模式下布局全乱了 – 解决办法...
  20. 【集成学习(上)】My_Task03掌握偏差与方差理论 笔记

热门文章

  1. windows2003下防火墙ISA大型实验
  2. svn 合并和树冲突
  3. GARFIELD@11-10-2004
  4. python源码笔记_python源码学习笔记(一)
  5. 酷冷至尊官方psu计算工具_一款精致的电源,轻松应付高端配置、酷冷至尊MWE750金牌全模组电源 体验...
  6. qpython3可视图形界面_PySide——Python图形化界面入门教程(三)
  7. 在哪里查看计算机配置的网络协议簇,tcp/ip协议簇
  8. idea工作台输出的日志详解_详解linux下nohup日志输出过大问题解决方案--分批切割...
  9. linux 中断奶乱码,科学断奶经历:早中晚三次母乳,一个月内循序渐进自然断奶...
  10. Qt中的ui文件是c语言文件吗,c-Qt-UI文件未在Visual Studio中更新