首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何转换像素格式?从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

复制
相关文章
在DataGridView控件中加入ComboBox下拉列表框的实现
本文转载:http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.html
跟着阿笨一起玩NET
2018/09/18
4.1K0
在DataGridView控件中加入ComboBox下拉列表框的实现
gridview属性_datagridview设置列宽
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Windows.Forms;
全栈程序员站长
2022/11/09
1.9K0
DataGridView 密码列(显示为*号)的设置
曾经为在DataGridView中设置密码列(显示为*号)而发愁,如何把Windows 窗体 DataGridView 的某一列的数据显示为“*”。
Java架构师必看
2021/03/22
2.5K0
C#dataGridView字体显示设置
1.设置dataGridView中数据的显示风格,需要设置DefaultCellStyle里面的SelectionBackColor还有Font(字体设置).
恋喵大鲤鱼
2018/08/03
1.9K0
html如何设置有序列表的列表项,HTML的有序列表
针对HTML的有序列表,由于平常使用的不是很多,刚开始使用的时候也是有遇到一些坑,有几个小问题:
全栈程序员站长
2022/07/02
3.4K0
html如何设置有序列表的列表项,HTML的有序列表
bindingnavigator如何与datagridview绑定
BindingNavigator 控件一般要与BindingSource 控件一同使用较为方便,因为对于 BindingNavigator 控件上的每个按钮,都有一个对应的 BindingSource组件成员,其以编程方式允许有相同功能。例如,MoveFirstItem 按钮对应于 BindingSource 组件的 MoveFirst 方法,DeleteItem 按钮对应于RemoveCurrent方法,等等。尽管 BindingNavigator 可以绑定到任何数据源,但它被设计为通过其BindingNavigator.BindingSource 属性与BindingSource 组件集成。
全栈程序员站长
2022/09/14
2K0
如何阻止云中的DDoS攻击
从2022年1月到7月,Sysdig威胁研究团队实施了一个全球蜜网系统,通过多个攻击载体捕获了大量漏洞。Sysdig在《2022年云原生威胁报告》中指出,相较2021年,2022年的攻击类型已经从加密挖矿明显转向分布式拒绝服务(DDoS)活动。 如果组织希望通过检测与此威胁相关的早期迹象,来了解如何在云环境中预防DDoS攻击,那么本文将介绍保护云基础设施所需的大多数最佳实践。 云中DoS攻击的技术和方法 在OSI(Open Systems Interconnection)模型中,DDoS攻击的模式和行为
FB客服
2023/02/24
1.8K0
如何阻止云中的DDoS攻击
Atom飞行手册翻译: 2.2 在Atom中移动
用鼠标和方向键,简单地在Atom中移来移去非常容易,然而Atom有一些快捷键,可以让你把手一直放到键盘上,更快速地浏览文档。
ApacheCN_飞龙
2022/11/27
1.1K0
Atom飞行手册翻译: 2.2 在Atom中移动
Pandas基础:在Pandas数据框架中移动列
有时候,我们需要在pandas数据框架内移动一列,shift()方法提供了一种方便的方法来实现。
fanjy
2022/06/04
3.4K0
Pandas基础:在Pandas数据框架中移动列
❤️ 如何在 Pygame 中移动你的游戏角色 ❤️
Pygame是一组跨平台的 Python 模块,专为编写视频游戏而设计。它包括旨在与 Python 编程语言一起使用的计算机图形和声音库。您可以使用 pygame 创建不同类型的游戏,包括街机游戏、平台游戏等等。
海拥
2021/09/09
2.5K0
❤️ 如何在 Pygame 中移动你的游戏角色 ❤️
在ORACLE中移动数据库文件
在ORACLE中移动数据库文件 --ORACLE数据库由数据文件,控制文件和联机日志文件三种文件组成。 --由于磁盘空间的变化,或者基于数据库磁盘I/O性能的调整等, --我們可能会考虑移动数据库文件。 --下面以LUNIX平台为例,分别讨论三种数据库文件的移动方法。 一.移动数据文件: -- 可以用ALTER DATABASE,ALTER TABLESPACE两种方法移动数据文件。 1. ALTER DATABASE方法; -- 用此方法,可以移动任何表空间的数据文件。 STEP 1. 下数据
阿新
2018/04/12
1.4K0
C# WinForm 设置DataGridView选中指定行
也有其他网友代码Cells[0]; 如下: 我试了 ,填0和1调试报错。所以 我填2
全栈程序员站长
2022/09/14
7240
是得懂点DNS了
毕设中一直接触到这个东西,想用,但是不熟。今天看到一篇文章:DNS + nginx 的妙用,是得熟悉一下 DNS 了。
看、未来
2022/05/06
6590
是得懂点DNS了
有了她,谁敢阻止我学习
公众号 1、Python爱好者社区,微信号:python_shequ 人生苦短,我用Python。分享Python相关的技术文章、工具资源、精选课程、视频教程、热点资讯、学习资料等。每天自动更新和推送。 2、Python爬虫分享,微信号:python_shequ 知乎专栏“爬虫从入门到放弃”作者。目前在知乎连载爬虫从入门到放弃到精通系列文章 3、张俊红,微信号:zhangjunhong0428 中国统计网专栏作者,数据分析路上的学习者与实践者,与你分享我的所见、所学、所想。 4、数据小魔方,微信号:data
小歪
2018/04/04
8910
【防护】如何阻止SELECT * 语句
利用思路(仅供参考): 今天在网上看了一篇文章,是用来防止select * 的思路,其实这个可以用于安全防护的,在你出现注入的时候很多都是解猜,很多脚本小子都会用selcet * 或者 or 1=1 之类的解猜所有,但如果你一查所有就报错呢?是不是能有效的防防那些脚本小子呢? 我们每个人都知道是个不好的做法,但有时我们还是要这样做:我们执行SELECT * 语句。这个方法有很多弊端: 你从你的表里返回每个列,甚至后期加的列。想下如果你的查询里将来加上了VARCHAR(MAX)会发生什么…… 对于指定的查询
逸鹏
2018/04/09
1.1K0
【防护】如何阻止SELECT * 语句
我是如何一不小心阻止了勒索病毒的全球蔓延
原作者 MalwareTech 编译 CDA 编译团队 本文为  CDA 数据分析师原创作品,转载需授权 前言 上周全球爆发电脑勒索病毒,“疫情”已波及 99 个国家。包括中国、俄罗斯、英国、美国在内的众多国家,都被该病毒搅得鸡犬不宁。 除英国国家医疗服务体系(NHS)、美国联邦快递、西班牙电信公司外,俄罗斯内政部的1000 多台电脑也纷纷“中招”,受到严重影响。而据俄罗斯RT新闻网报道,最新的数据统计显示,全球范围内已有超过 10 万台电脑被攻击。 但就在这场损伤巨大的全球“浩劫”中,一位“意外的英雄
CDA数据分析师
2018/02/26
1.6K0
我是如何一不小心阻止了勒索病毒的全球蔓延
Redis 再牛逼,也得设置密码!
还有,比如像出现下面这样的错,需要设置密码,或者关闭保护模式,所以还是设置密码比较安全。不然只能本地操作,不能远程连接。
Java技术栈
2018/09/29
1.3K0
Super快报第25期:中移动终于可以吃苹果了?
1、德国立法要求谷歌向内容发布商付费 德国立法者周五通过了一项提案,允许内容发布商向搜索引擎和其他网络内容聚合商收取内容使用费,但仍然允许这类企业免费使用文本链接和摘要。   该立法提案最早是去年由德国总理默克尔(Angela Merkel)提交的。外界认为,此举表明欧洲政府将加大立法进程,迫使谷歌等公司与他们所使用的内容来源分享巨额广告收入。 笔者前几天的文章《搜索引擎的大数据时代》(请移步至博客(www.xiaoshejian.com))曾提出观点:“搜索吃了免费数据10多年,接下
罗超频道
2018/04/25
6600
BI 产品中过滤器设置
腾讯云商业智能分析团队
2017/09/15
3.2K0
BI 产品中过滤器设置
BindingNavigator操作DatagridView的数据[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 参考 http://wenku.baidu.com/link?url=NWfEfArPZvDO_aI-xEKBHVGoZY9wQO_Oty_GCsGLiPsp
全栈程序员站长
2022/09/14
1.1K0

相似问题

如何阻止TextView在其他项目RelativeLayout之外扩展得太远?

42

头伸得太远

11

jQuery移动按钮伸得太远

43

在fullCalendar中,事件呈现得太远了

11

Div在页面中延伸得太远了

12
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档