玩玩图形图像——第一篇:图片灰度化

标签: 图形 图像 图片 | 发表时间:2013-01-04 23:52 | 作者:一线码农
出处:http://www.cnblogs.com/

 

    去年买了本数字图像处理算法,一直都没有看,前几个星期都一直忙着工作上的活,趁这阶段悠闲点,玩一玩图片处理,这玩意

还是非常有意思的。

   以前我们在做Web上的用户注册时,通常都会做一个验证码,大家都知道用来防止暴力注册的,当然提到验证码大家都知道C#里

面有一个Bitmap类专门用来处理图片的,好吧,这一篇我们从最简单的“图片灰度化”说起。

一:图片灰度化

     我们都知道,位图是由一个一个像素点组成的,像素点可能是红色,橙色,粉色等等,这些颜色我们都知道是用RGB来表示的。

每个颜色分量都是一个字节(0-255),所以一般情况下图的像素点都是24位,当然还有32位,64位,当RGB是0-255之间的不同值

时,那么该像素点就呈现“五颜六色”,而当RGB都是相同的值是,则像素点呈现“灰色”,如果大家玩过CSS的话,肯定都知道给一个

字体的color通常都是#999999,#666666,#333333这些不同深度的灰色。

1.计算公式

   下面我们该如何设置合理的灰度值呢?当然还是用当前的RGB为模板,然后对RGB乘以一个合理的权重就ok了

   Gary(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.114*B(i,j);

2.编程

  有了公式,实现起来就不成问题了。Bitmap类中有一个GetPixel/SetPixel,它可以获取和设置当前的像素点。

static void Main(string[] args)
{
Bitmap bitmap = new Bitmap(Environment.CurrentDirectory + "//1.jpg");

for (int i = 0; i < bitmap.Width; i++)
{
for (int j = 0; j < bitmap.Height; j++)
{
//取图片当前的像素点
var color = bitmap.GetPixel(i, j);

var gray = (int)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114);

//重新设置当前的像素点
bitmap.SetPixel(i, j, Color.FromArgb(gray, gray, gray));
}
}

bitmap.Save(Environment.CurrentDirectory + "//2.jpg");
}

  

3.改进

   上面这个方法很简单,Get/Set就Ok了,当然这是我们站在像素点这个角度来考虑问题的,貌似只要O(N 2)的时间就可以KO问

题,但是Get/Set远远不是O(1)的,基于性能考虑,我们能不能有更优的方法,此时我们可以站在字节这个角度思考,不过这里我

们要注意一个问题就是:比如图片的width=21px,一个像素点占用3个字节,但是21个像素点不一定就占用63个字节,这是因为

系统基于性能考虑,在每一行中存放着一个“未用区域”,来确保图片每行的byte数是4的倍数,那么如何去读某一行的字节数呢?

C#里面有一个Stride属性就可以用来获取,很简单吧。

static void Main(string[] args)
{
Bitmap bitmap = new Bitmap(Environment.CurrentDirectory + "//1.jpg");

//定义锁定bitmap的rect的指定范围区域
Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);

//加锁区域像素
var bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat);

//位图的首地址
var ptr = bitmapData.Scan0;

//stride:扫描行
int len = bitmapData.Stride * bitmap.Height;

var bytes = new byte[len];

//锁定区域的像素值copy到byte数组中
Marshal.Copy(ptr, bytes, 0, len);

for (int i = 0; i < bitmap.Height; i++)
{
for (int j = 0; j < bitmap.Width * 3; j = j + 3)
{
var color = bytes[i * bitmapData.Stride + j + 2] * 0.299
+ bytes[i * bitmapData.Stride + j + 1] * 0.597
+ bytes[i * bitmapData.Stride + j] * 0.114;

bytes[i * bitmapData.Stride + j]
= bytes[i * bitmapData.Stride + j + 1]
= bytes[i * bitmapData.Stride + j + 2] = (byte)color;
}
}

//copy回位图
Marshal.Copy(bytes, 0, ptr, len);

//解锁
bitmap.UnlockBits(bitmapData);

bitmap.Save(Environment.CurrentDirectory + "//3.jpg");
}

  

 

本文链接

相关 [图形 图像 图片] 推荐:

玩玩图形图像——第一篇:图片灰度化

- - 博客园_首页
    去年买了本数字图像处理算法,一直都没有看,前几个星期都一直忙着工作上的活,趁这阶段悠闲点,玩一玩图片处理,这玩意.    以前我们在做Web上的用户注册时,通常都会做一个验证码,大家都知道用来防止暴力注册的,当然提到验证码大家都知道C#里. 面有一个Bitmap类专门用来处理图片的,好吧,这一篇我们从最简单的“图片灰度化”说起.

将画布(canvas)图像保存成本地图片的方法

- - WebHek
之前我曾介绍过如何将HTML5 画布(canvas)内容转变成图片形式,方法十分简单. 但后来我发现只将canvas内容转变成图片输出还不够,如何能将转变后的图片保存到本地呢. 其实,这个方法也是非常简单的,几乎不用额外的编程知识. 但我们可以更完美些,下面我将使用 canvas2image.js, base64.js这两个脚本实现更强大的canvas->图片->本地的过程.

如何节省 1T 图片带宽?解密极致图像压缩

- - IT瘾-dev
图像已经发展成人类沟通的视觉语言. 无论传统互联网还是移动互联网,图像一直占据着很大部分的流量. 如何在保证视觉体验的情况下减少数据流量消耗,一直是图像处理领域研究的热点. 也诞生了许多种类的图像格式JPEG、PNG 、GIF、WEBP、HEVC,以及腾讯公司自研的WXAM和SHARPP格式. 腾讯TEG - 架构平台部图片存储系统TPS 作为超大规模的图片平台,图片数万亿张存储量百P,下载带宽数T,一直需要严重关注图像压缩技术的发展.

CSS图形

- GLORY - 酷壳 - CoolShell.cn
下面的示例展示了使用纯CSS制作的各种图形,你可以自由地修改文中的CSS代码. 经测试,IE9, Chrome, FF, Safari都可以正常显示. 五角星形 via Kit MacAllister. 心形 via Nicolas Gallagher. 无穷大 via Nicolas Gallagher.

图形版Telex

- Vent - 闲云野鹤的家
启动时程序自动设置浏览器代理,退出后自动取消浏览器代理. 下载   http://u.115.com/file/e6dpvsfy.

图形化简历

- Jacqueline - 阮一峰的网络日志
信息的图形化是目前的热门方向,很多人都在研究. 有些设计师开始尝试"图形化简历"(Infographic Resume),即以图形为主、文字为辅表示个人的主要信息. 程序员Christopher Perkins用5种颜色的直线,表示自己的5个主要方面(工作经历、教育背景、主要领域等). 每条直线上标出重大事件的时间节点.

函数图像(二)

- DreamToTrue - C++博客-λ-calculus(惊愕到手了欧耶)
    今天终于把雏形给做出来了. 主要的方法是牛顿迭代法,把屏幕上的所有点都收敛到函数图像上面. 为了提速,我是用了ThreadTool.QueueUserWorkItem和Parallel.For,还把那颗函数的语法树用Linq.Expression编译成了机器码. 下面的这些图都是二十秒钟左右就可以画出来的了.

(libgdx小结)图形绘制

- - CSDN博客推荐文章
    在这一小节的图形绘制中所涉及到的类主要有4个:Texture 、TextureRegion、SpriteBatch、Sprite. Texture:图片的容器. TextureRegion:用于截取Texture. SpriteBatch:相当于画笔. Sprite:其实就是加强版的TextureRegion和SpriteBatch.

分享图片

- 糖果 - 变态辣椒的时政漫画

是包包还是图像?

- Kidwind - 玩意儿
看起来它就像是一个画上去的图,眼睛被完全欺骗了,它们本身就是真正的包包. 设计师先在图上画好插图,然后制作成立体形式的包包,来以真乱假. 本文原始链接:http://www.cngadget.cn/jump-from-paper.html.