在图像处理中,我们经常需要将真彩色图像转换为黑白图像。黑白图像即为灰度图,即只有纯黑,纯白两种颜色。
计算机中的图像大致可以分为两类:位图(Bitmap)和矢量图(Metafile)。位图可以视为一个二维的网格,整个图像就是由很多个点组成的,点的个数等于位图的宽乘以高。每个点被称为一个像素点,每个像素点由确定的颜色,当很多个像素合在一起时就形成了一幅完整的图像。
我们通常使用的图像大部分是位图,因为位图可以完美的表示图像的细节,能较好的还原图像的原景。但位图也有缺点:第一是体积比较大,第二是位图在放大时,不可避免的会出现“锯齿”现象,这也是由位图的本质特点决定的。所以在现实中,我们还需要使用到另一种图像格式:矢量图。同位图的原理不同,矢量图是利用数学公式通过圆,线段等绘制出来的,所以不管如何放大都不会出现变形,但矢量图不能描述非常复杂的图像。所以矢量图都是用来描述图形图案。
在位图中,通常是用RGB三色方式来表示颜色的(位数很少时要使用调色板)所以每个像素采用不同的位数,就可以表示出不同数量的颜色。当我们使用24位色时(3个字节),我们可以得到2的24次方(1600多万种颜色)。现在计算机使用最多的是24位色,但是在GDI+中还有32位色,多出来的一个通道描述Alpha,即透明分量。
在我们保存灰度图时,灰度图中的颜色数量一共只有256种(1个字节),所以转换后的图像我们通常保存为8位格式而不是24位格式,这样比较节省空间。而8位图像是使用调色板方式来保存颜色的。而不是直接保存颜色值。调色板中可以保存256种颜色,所以可以正好把256种灰度颜色保存到调色板中。
代码如下:// 通过指针将图像转换为灰度图Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);// 提供一个8位图像的容器Bitmap bit = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format8bppIndexed);BitmapData bmpData1 = bit.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);// 字节初始值为0byte temp = 0;unsafe{// 获取其指针首地址位byte* ptr = (byte*)bmpData.Scan0;byte* ptr1 = (byte*)bmpData1.Scan0;for (int i = 0; i < bmpData.Height; i++){for (int j = 0; j < bmpData.Width; j++){temp = (byte)(0.299 * ptr[2] + 0.587 * ptr[1] + 0.114 * ptr[0]);// R=G=Bptr[0] = ptr[1] = ptr[2]=temp;// 给灰度图像赋值ptr1[i * bmpData1.Stride + j] = temp;// 指向下一个像素ptr += 3;}// 指向下一行ptr += bmpData.Stride - bmpData.Width * 3;}// 解锁该位图图像bmp.UnlockBits(bmpData);bit.UnlockBits(bmpData1);// 将灰度图像保存为8位图像ColorPalette palette = bit.Palette;for (int i = 0; i < palette.Entries.Length; i++){palette.Entries[i] = Color.FromArgb(i, i, i);}bit.Palette = palette;bit.Save("1.bmp", ImageFormat.Bmp);// 释放资源bmp.Dispose();bit.Dispose();

使用GDI+将24位真彩色图像转换为8位灰度图像相关推荐

  1. 24位真彩色图像转换为16位高彩色图像的实现方法及效果改进

    本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop. 转载自:https://www.cnblogs.com/Imageshop/p/3453569.html   ...

  2. 真彩色图像转换为16位(高彩色)图像的实现及需要注意的事项。

    测试效果程序:http://files.cnblogs.com/laviewpbt/%E7%9C%9F%E5%BD%A9%E8%89%B2%E8%BD%AC%E9%AB%98%E5%BD%A9%E8% ...

  3. MATLAB真彩色图像转换为索引图

    下面来介绍一下如何在Matlab中将真彩色图像转换为索引图,具体步骤如下: 1.打开MATLAB,在其主界面的编辑器中写入下列代码: load trees %加载图片 I=ind2gray(X,map ...

  4. 将24位真彩色图转换为8位灰度图片

    /** * 程序名: Convert.cpp * 功  能: 将24位真彩色图转换为8位灰度图片 *  测试图片test1.bmp放到工程目录下 */ #include <iostream> ...

  5. labelme 标注生成24位深度图像转换为8位

    新版本的 labelme 标注完成图像后,将 json 文件转换为图像时已经转换为 8 通道图像,如下图所示: 最近在看别人程序时发现经过图像标注生成的 label 一片黑,且图像深度为 24 位,如 ...

  6. 将32位浮点音频转换为16位

    (注:只改变量化位数,并不改变采样率和声道数等信息)  弄了一个下午加一个早上,终于算是弄完了,效果非常不错,音质无损失,之前一直用ffmpeg做重采样处理,但是一直是各种艰辛,各种奔溃,很无语,最后 ...

  7. 64位数值强制转换为32位

    在程序中经常看到将int64的类型强制转换为int32类型,转换前后发生什么样的变化呢? int64 a=xxxxx; int32 b=0; b=a; b=a的过程几完成了强制转换. 其实强制转换的过 ...

  8. python字符串转64位数字_python-将String转换为64位整数映射字符以自定义两位值映射...

    您将4个不同"数字"的字符串解释为数字,因此以4为基数.如果您有一串实际数字,范围为0-3,则可以让int()真正快速地生成一个整数. def seq_to_int(seq, _m ...

  9. 将16位的深度图转换为8位深度图

    原理 一张16位的图像,意思是一张图像的每个像素点的像素值都由16位的二进制数表示,每个像素点的颜色有 2^16 = 65536 种可能. 也就是说,图像的颜色区间被划分成了2^16 = 65536份 ...

最新文章

  1. MySQL 性能监控4大指标——第一部分
  2. sql server 按时间段查询
  3. angularJS 全选反选批量删除
  4. mysql 分析查询语句,MySQL教程之SQL语句分析查询优化
  5. GrowingIO创始人兼CEO张溪梦:互联网下半场,数据如何驱动企业突破增长重围?
  6. UI设计素材干货模板|移动按钮的“悬停效果”
  7. python美女源代码_单身程序员,每晚用python抓取百万张美女图片,连女友都不想找了...
  8. 学生系统优化——字符限定
  9. 论文阅读(4) 游泳水母对被动能量再捕获的广泛利用(2018)
  10. Qt获取音频输入和输出设备
  11. 动图体积太大怎么缩小?教你一招快速压缩gif
  12. 计算机科学与技术用惠普星15,暑期最有颜值的学习装备,惠普星14高性能轻薄本必选...
  13. 服务器拒绝mac访问共享文件,Mac怎样访问局域网共享文件
  14. gensim w2v 使用记录
  15. Day.js —— 一个轻量型的日期时间库 moment 的完美代替品
  16. win10计算器_计算器也能刷Win10,国外大神又现惊人操作
  17. 【Linux】 ubuntu16.04系统使用印象笔记
  18. vs2008编译live555源码
  19. 苹果移动设备密码破解
  20. opencv2.4.13在win10+VS2015下的配置过程

热门文章

  1. 16款免费开源的商业智能工具
  2. 和平精英当前您所在的服务器更新维护,光子再次更新体验服招募时间 3月新版本疑似再度延迟...
  3. zxing白边java_ZXing生成无白边条形码
  4. 记Mininet安装
  5. 输入框向上移动HTML5,HTML输入框样式
  6. stdcall cdecl
  7. html5模仿手机音乐播放器,仿酷狗html5手机音乐播放器主要部分代码_html5教程技巧...
  8. 性能提升10倍以上:阿里达摩院成功研发新型存算一体芯片
  9. 正大国际期货:焦煤焦炭期货部分合约交易保证金水平将调整
  10. Virtual Box Ubuntu16.04中导入SEED LABS虚拟机后无法全屏显示