首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何转换像素格式?从32 32bppRGB到16 From的C#灰度

如何转换像素格式?从32 32bppRGB到16 From的C#灰度
EN

Stack Overflow用户
提问于 2011-06-06 03:52:31
回答 2查看 10.6K关注 0票数 5

我需要为我的形象做一些阈值。阈值滤波函数只接受8-16bpp灰度级。我的位图图片有32bppRGB像素格式。请给出一些相同的代码。(我还想知道,如果没有逐像素的操作,是否有可能)

附注:我正在使用Aforge.NET进行阈值处理。

谢谢

-Sagar

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-06 04:00:26

最简单的方法:

代码语言:javascript
运行
AI代码解释
复制
public static Bitmap MakeGrayscale(Bitmap original)
 {
    //make an empty bitmap the same size as original
    Bitmap newBitmap = new Bitmap(original.Width, original.Height);

   for (int i = 0; i < original.Width; i++)
    {
       for (int j = 0; j < original.Height; j++)
       {
          //get the pixel from the original image
          Color originalColor = original.GetPixel(i, j);

         //create the grayscale version of the pixel
          int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59)
              + (originalColor.B * .11));

         //create the color object
          Color newColor =  Color.FromArgb(grayScale, grayScale, grayScale);

          //set the new image's pixel to the grayscale version
          newBitmap.SetPixel(i, j, newColor);
         }
     }

    return newBitmap;
 }

更快的方法:

代码语言:javascript
运行
AI代码解释
复制
public static Bitmap MakeGrayscale2(Bitmap original)
 {
    unsafe
    {
       //create an empty bitmap the same size as original
       Bitmap newBitmap = new Bitmap(original.Width, original.Height);

      //lock the original bitmap in memory
       BitmapData originalData = original.LockBits(
          new Rectangle(0, 0, original.Width, original.Height),
          ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

      //lock the new bitmap in memory
       BitmapData newData = newBitmap.LockBits(
          new Rectangle(0, 0, original.Width, original.Height), 
         ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

       //set the number of bytes per pixel
       int pixelSize = 3;

      for (int y = 0; y < original.Height; y++)
       {
          //get the data from the original image
          byte* oRow = (byte*)originalData.Scan0 + (y * originalData.Stride);

         //get the data from the new image
          byte* nRow = (byte*)newData.Scan0 + (y * newData.Stride);

         for (int x = 0; x < original.Width; x++)
          {
             //create the grayscale version
             byte grayScale = 
               (byte)((oRow[x * pixelSize] * .11) + //B
                (oRow[x * pixelSize + 1] * .59) +  //G
                (oRow[x * pixelSize + 2] * .3)); //R

            //set the new image's pixel to the grayscale version
             nRow[x * pixelSize] = grayScale; //B
             nRow[x * pixelSize + 1] = grayScale; //G
             nRow[x * pixelSize + 2] = grayScale; //R
          }
       }

      //unlock the bitmaps
       newBitmap.UnlockBits(newData);
       original.UnlockBits(originalData);

      return newBitmap;
    }
 }

最快的方法:

代码语言:javascript
运行
AI代码解释
复制
public static Bitmap MakeGrayscale3(Bitmap original)
 {
    //create a blank bitmap the same size as original
    Bitmap newBitmap = new Bitmap(original.Width, original.Height);

    //get a graphics object from the new image
    Graphics g = Graphics.FromImage(newBitmap);

   //create the grayscale ColorMatrix
    ColorMatrix colorMatrix = new ColorMatrix(
       new float[][] 
      {
          new float[] {.3f, .3f, .3f, 0, 0},
          new float[] {.59f, .59f, .59f, 0, 0},
          new float[] {.11f, .11f, .11f, 0, 0},
          new float[] {0, 0, 0, 1, 0},
          new float[] {0, 0, 0, 0, 1}
       });

   //create some image attributes
    ImageAttributes attributes = new ImageAttributes();

   //set the color matrix attribute
    attributes.SetColorMatrix(colorMatrix);

   //draw the original image on the new image
    //using the grayscale color matrix
    g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
       0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);

   //dispose the Graphics object
    g.Dispose();
    return newBitmap;
 }
票数 4
EN

Stack Overflow用户

发布于 2011-06-06 04:01:45

使用AForge.NET框架灰度滤波器

该滤波器接受24、32、48和64 bpp彩色图像,并产生8 (if源为24或32 bpp图像)或16 (如果源为48或64 bpp图像) bpp灰度图像。

然后应用阈值滤波器。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6251599

复制
相关文章
jQuery动态添加/删除元素及内容
添加新的 HTML 内容,四种方法:可根据上面的图片来区分四种方法插入元素的位置。
德顺
2019/11/12
7.3K0
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
指定元素中包含 id 属性的, 如: $("span[id]")  代码如下: <span id="span1" name="S1">AAA</span><br/>  <span id="span2" name="S2">BBB</span><br/>  <span name="Sx3">CCC</span><br/>  <span name="Sx4">DDD</span><br/>  <div id="div1" name="Dx1">EEE</div>  <div name="D2">FFF</div
hbbliyong
2018/03/06
1.6K0
jquery 节点的删除
detach()方法删除跟remove()一样,在删除节点后,同样也可以赋值给变量再次使用。
坚毅的小解同志的前端社区
2022/11/28
1.7K0
jquery 节点的删除
jquery根据属性选择
有信仰的人不会孤独。——阿列克谢耶维奇 分享一个jquery选择器的小技巧 我们可以通过自定义属性键值选中一个元素 例如如下元素: <div ruben="vampire">阿超</div> 然后我们通过ruben=vampire选中这个div 就可以如下写法: let vampire = $('div[ruben="vampire"]') 我们可以简单测试一下输出里面的内容 <div ruben="vampire">阿超</div> <script type="text/javascript">
阿超
2022/08/17
2K0
jquery根据属性选择
jquery点击删除按钮,删除当前的div
现在有多行div,共用一个删除事件,点击删除的时候,会把页面所有的div全都删掉了,但是我只需要点击哪一行div里面的删除按钮,就删除哪一行,其实很简单,只需要写一个this事件即可。
王小婷
2019/07/08
5.5K0
JavaScript进阶内容——jQuery
我们在前面的文章中已经掌握了JavaScript的全部内容,现在让我们了解一下JavaScript库
秋落雨微凉
2022/10/25
5.5K0
JavaScript进阶内容——jQuery
jquery 表格内容搜索
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title></title> <link href="css/style.css" rel="stylesheet" type="text/css" /> <script src="../../scripts/jquery.js" type="text/javascript"></script> <script type="text/javascript">
用户5760343
2019/10/10
2.3K0
jquery 表格内容搜索
activity结束之后刷新之前的activity的内容
点击添加按钮之后-----弹出一个新的activity--------在新的activity将数据输入保存之后,关闭当前的activity回到之前的activity刷新内容 实现:使用onActivityResult 启动页: btnButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent i
欢醉
2018/01/22
9270
jQuery Mobile修改button的内容
jQuery Mobile修改button的内容。
业余草
2019/01/21
1.8K0
jQuery Mobile修改button的内容
Linux Vi 删除全部内容,删除某行到结尾,删除某段内容 的方法
1.打开文件 vi filename  2.转到文件结尾 G   或转到第9行 9G   3.删除所有内容(先用G转到文件尾) ,使用: :1,.d   或者删除第9行到第200行的内容(先用200G转到第200行) ,使用 :9,.d   删除说明:这是在vi中 ,“.”当前行 ,“1,.”表示从第一行到当前行 ,“d”删除
joshua317
2018/04/10
7.5K0
如何根据日志查看删除的数据(转译)
原文地址:https://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/   在我的SQLServer的工作中,最经常被问到的一个问题就是“能恢复删除的数据吗?”   我的回答是肯定的,注意下面的数据类型是可以通过脚本直接恢复的,当然数据库的版本要在SQLServer2005 以上才行。 经过讨论发现2008和2012以及2014的express版本也不能实现脚本直接恢复。 image text uniqueidentif
用户1217611
2018/01/30
7.5K0
jQuery中的常用内容总结(一)
jQuery中的常用内容总结(一) 前言 不好意思(✿◠‿◠),由于回家看病以及处理一些其它事情耽搁了,不然这篇博客本该上上周或者上周写的;同时闲谈几句:在这里建议各位开发的童鞋,如果有疾病尽快治疗,不要拖,大病的话甚是~,身体是本钱,如果人的身体健康是一的话,若没有前面的一,后面再多的零也是徒然,同时,建议在开发的时候保持一个好的心态,积极面对需求和技术难点,不要像我一样在难的地方朝一个地方死钻、而且经常性考虑需求之外的需求,这样都是不太好,尽量以"需求"的心态去"开发",而不是以"开发"的心态做"需求
上帝
2018/05/18
1.1K0
jQuery中的常用内容总结(二)
jQuery中的常用内容总结(二) 转载请注明地址: http://www.cnblogs.com/funnyzpc/p/7571993.html 前言   距离上次博客更新已经有二十来天了(●′ω`●),恍惚之间时间已经从身边流走~,好难过≡(▔﹏▔)≡;所以,我决定这次不管熬夜到几点都要把本节和第三节内容全部写完~ 内容提要 ---- 选择器(上一节) 选择器的扩展方法(上一节) 节点的CSS操作及节点其他操作(上一节) Ajax同步与异步(本节) 事件(本节) 弹窗(本节) 参数序列化(第三节) 遍
上帝
2018/05/18
1.5K0
jQuery中的常用内容总结(一)
jQuery中的常用内容总结(一) 前言 不好意思(✿◠‿◠),由于回家看病以及处理一些其它事情耽搁了,不然这篇博客本该上上周或者上周写的;同时闲谈几句:在这里建议各位开发的童鞋,如果有疾病尽快治疗,不要拖,大病的话甚是~,身体是本钱,如果人的身体健康是一的话,若没有前面的一,后面再多的零也是徒然,同时,建议在开发的时候保持一个好的心态,积极面对需求和技术难点,不要像我一样在难的地方朝一个地方死钻、而且经常性考虑需求之外的需求,这样都是不太好,尽量以"需求"的心态去"开发",而不是以"开发"的心态做"需求
上帝
2018/06/26
1K0
jQuery中的常用内容总结(二)
转载请注明地址: http://www.cnblogs.com/funnyzpc/p/7571993.html
上帝
2018/09/27
1.2K0
jQuery中的常用内容总结(二)
jQuery - 设置内容和属性
下面的例子演示如何通过 text()、html() 以及 val() 方法来设置内容:
陈不成i
2021/07/22
2.1K0
jQuery中的常用内容总结(二)
jQuery中的常用内容总结(二) 转载请注明地址: http://www.cnblogs.com/funnyzpc/p/7571993.html 前言   距离上次博客更新已经有二十来天了(●′ω`●),恍惚之间时间已经从身边流走~,好难过≡(▔﹏▔)≡;所以,我决定这次不管熬夜到几点都要把本节和第三节内容全部写完~ ajax在实际开发中用的特别多,尤其是前后端分离的今天甚是~,接下来所说的ajax都是经过jQuery封装过的,至于写法大致有ajax标准写法和jQuery简写两种,下面先给出这两种写
上帝
2018/06/26
3K3
jQuery中的常用内容总结(三)
转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7571998.html
上帝
2018/09/27
8420
jQuery中的常用内容总结(三)
jQuery中的常用内容总结(三)
jQuery中的常用内容总结(三) 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7571998.html 内容提要 ---- 选择器(第一节) 选择器的扩展方法(第一节) 节点的CSS操作及节点其他操作(第一节) Ajax同步与异步(上一节) 事件(上一节) 弹窗(上一节) 参数序列化(本节) 遍历(本节) 其他(本节) ---- A>表单参数序列化提交 如果没有借助jQuery,表单可以直接提交,这样带来两个问题就是安全(get提交)或表单参数验证障碍,嗯~,可能
上帝
2018/05/18
2K1
jQuery中的常用内容总结(三)
jQuery中的常用内容总结(三) 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7571998.html ---- A>表单参数序列化提交 如果没有借助jQ
上帝
2018/06/26
8480

相似问题

jQuery根据内容删除分区

22

jquery在删除之前的内容后追加内容

21

使用jQuery根据td的内容删除td

45

JQuery如何根据子元素的内容删除元素

45

在使用jquery克隆文本内容之前将其删除

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档