[分享][代码][放分]C# 简单图像处理类
今天在CodeProject上找到这篇文章,还算实用,不敢独享,送给大家!
原文地址
示例下载
源码下载(VS2005)
简介
...
概述
这篇文章的目的是构建一个图像处理功能的类而使每一个C#程序员都能够使用。因为使用C#能够非常灵活的进行图像处理。
我们知道,当基于计算来移动像素或改变像素值的代码稍微有点复杂。
应用
ImageHandler类负责图像处理的相关操作,如保存、图像关联操作等。功能包括:获取图片信息、
缩放、色彩滤镜、亮度、反向、灰度、转换、裁贴、和插入文字、其它图片或几何图形。
Paint方法使用AutoScoolPosition属性发现滚动位置,使用AutoScrollMinSize属性进行设置。
1.Color Filter(色相)
关于色相的说明:
从光学意义上讲,色相差别是由光波波长的长短产生的。即便是同一类颜色,也能分为几种色相,如黄颜色可以分为中黄、土黄、
柠檬黄等,灰颜色则可以分为红灰、蓝灰、紫灰等。光谱中有红、橙、黄、绿、蓝、紫六种基本色光,人的眼睛可以 分辨出约180种不同色相的颜色。
颜色过滤是依照颜色的光谱吸收类别:短波长、长波长、混合波长;合并或形状裁贴;单色或变色的。
详见:http://baike.baidu.com/view/122648.htm
这个比较简单,只需要增加或减少每种颜色的值即可。
使图片中的另外两种颜色值减去255即可。比如,红色相中,保持红色值不变,而对绿色和蓝色分别减去255即可。
- C# code
/// <summary> /// 设置色相 /// </summary> /// <param name="colorFilterType">色相类型</param> public void SetColorFilter(ColorFilterTypes colorFilterType) { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); Color c; for (int i = 0; i < bmap.Width; i++) { for (int j = 0; j < bmap.Height; j++) { c = bmap.GetPixel(i, j); int nPixelR = 0; int nPixelG = 0; int nPixelB = 0; if (colorFilterType == ColorFilterTypes.Red) { nPixelR = c.R; nPixelG = c.G - 255; nPixelB = c.B - 255; } else if (colorFilterType == ColorFilterTypes.Green) { nPixelR = c.R - 255; nPixelG = c.G; nPixelB = c.B - 255; } else if (colorFilterType == ColorFilterTypes.Blue) { nPixelR = c.R - 255; nPixelG = c.G - 255; nPixelB = c.B; } nPixelR = Math.Max(nPixelR, 0); nPixelR = Math.Min(255, nPixelR); nPixelG = Math.Max(nPixelG, 0); nPixelG = Math.Min(255, nPixelG); nPixelB = Math.Max(nPixelB, 0); nPixelB = Math.Min(255, nPixelB); bmap.SetPixel(i, j, Color.FromArgb((byte)nPixelR, (byte)nPixelG, (byte)nPixelB)); } } _currentBitmap = (Bitmap)bmap.Clone(); }
2.Gamma(曲线)
Gamma源于CRT(显示器/电视机)的响应曲线,即其亮度与输入电压的非线性关系。
Gamma 校正补偿了不同输出设备存在的颜色显示差异,从而使图像在不同的监视器上呈现出相同的效果。
详见 :http://baike.baidu.com/view/476857.htm
- C# code
/// <summary> /// 曲线 /// </summary> /// <param name="red">红</param> /// <param name="green">绿</param> /// <param name="blue">蓝</param> public void SetGamma(double red, double green, double blue) { Bitmap temp = (Bitmap)_currentBitmap; Bitmap bmap = (Bitmap)temp.Clone(); Color c; byte[] redGamma = CreateGammaArray(red); byte[] greenGamma = CreateGammaArray(green); byte[] blueGamma = CreateGammaArray(blue); for (int i = 0; i < bmap.Width; i++) { for (int j = 0; j < bmap.Height; j++) { c = bmap.GetPixel(i, j); bmap.SetPixel(i, j, Color.FromArgb(redGamma[c.R], greenGamma[c.G], blueGamma[c.B])); } } _currentBitmap = (Bitmap)bmap.Clone(); } /// <summary> /// 获取曲线数组 /// </summary> /// <param name="color">色彩</param> /// <returns>数组</returns> private byte[] CreateGammaArray(double color) { byte[] gammaArray = new byte[256]; for (int i = 0; i < 256; ++i) { gammaArray[i] = (byte)Math.Min(255, (int)((255.0 * Math.Pow(i / 255.0, 1.0 / color)) + 0.5)); } return gammaArray; }
[解决办法]
┏━━━━━━━━━━━━━━━━━━┓
Execellent !!!
┗━━━━━━━━━━━━━━━━━━┛
[解决办法]
谢谢分享 UP!!
[解决办法]
很强大
谢谢分享!
接分!
[解决办法]
不错!不错!
收藏了!顺便接分!哈哈!
[解决办法]
好东西,谢谢,学习学习。
[解决办法]
不错,学习。
[解决办法]
Execellent !!!
楼主非常强大~!~!
[解决办法]
帮顶
[解决办法]
楼主这个东西不错,已经放在网摘了,
[解决办法]
顶
[解决办法]
mark
[解决办法]
很好,谢谢lz分享这么好的代码.呵呵
不过,这么做的话处理速度是个问题呀,尤其是对于分辨率比较大的图像
[解决办法]
帮顶
[解决办法]
[解决办法]
学习了
[解决办法]
upup
[解决办法]
顶!!!谢谢LZ分享,文章简练,容易学习,内容很实用!
[解决办法]
超赞,什么也不说了,up 先
[解决办法]
收集得很不错啊,谢谢分享。
以后又这样的好的技术点大家都可以学学楼主来和csdn上的朋友分享..
[解决办法]
MARK UP 顶
[解决办法]
学习
[解决办法]
好...鼓掌下:)
[解决办法]
谢谢分享
[解决办法]
jf
[解决办法]
不错
[解决办法]
强人,顶
[解决办法]
MARK
[解决办法]
OO
[解决办法]
[解决办法]
谢谢楼主分享
[解决办法]
鼓掌 鼓掌
接分
[解决办法]
学习,谢谢分享
[解决办法]
不错,收藏了!不过有个更强大的图片处理程序,源码全共享http://www.cnpopsoft.com/article.asp?id=76
[解决办法]
不错的免费.net代码
顶 楼主热心人啊
[解决办法]
顶
[解决办法]
谢谢分享
[解决办法]
好东西~
[解决办法]
( ^_^ )不错嘛,感激中
[解决办法]
多谢分享
[解决办法]
很不错。
[解决办法]
……有意思啊,值得收藏的文章
[解决办法]
好!
加精!
[解决办法]
顶!!!谢谢LZ分享,文章简练,容易学习,内容很实用!
[解决办法]
有没有什么方法可以吧狗狗的背景变成白色的?
[解决办法]
好全啊,谢谢分享。值得收藏啊
[解决办法]
收藏!
[解决办法]
不错,收藏
[解决办法]
占个位,收藏下!
[解决办法]
挺强大啊!!!
[解决办法]
确实不错,收藏了测试下
不知道改变图片长度和高度后图片大小会不会变
[解决办法]
收藏了,下次有用时再看看
[解决办法]
ding
mark
[解决办法]
感谢分享,学习+收藏
[解决办法]
LZ大好人!一定很漂亮
[解决办法]
很厉害,收藏了
[解决办法]
LZ大好人!一定很漂亮
[解决办法]
mark
[解决办法]
up
[解决办法]
jf,sc
[解决办法]
mark
[解决办法]
LZ很帅!!!分享了~~~好东西喂!!
谢谢LZ
[解决办法]
楼主幸苦了…………
[解决办法]
确实不错,收藏了
[解决办法]
好像不错~
[解决办法]
mark,谢谢楼主分享!
[解决办法]
ding
------解决方案--------------------
不错!
收藏了!
[解决办法]
up。。。学习一下
[解决办法]
许多的处理都是直接操作像素,而据我所知,managed code中GDI+操作像系效率是很低的。如果能改成unmanaged code,直接操作指针,效率会高得多。
[解决办法]
谢谢分享哦!!!
收藏了!
[解决办法]
谢谢分享
[解决办法]
up
[解决办法]
不错,我这个菜鸟得学习学习
[解决办法]
作的好啊 还有代码 好好分析一下
[解决办法]
谢谢分享
[解决办法]
谢谢楼主 mark
[解决办法]
学习加收藏
[解决办法]
很好
[解决办法]
感谢分享,很有启发性~
[解决办法]
学习 谢谢楼主分享
[解决办法]
up
[解决办法]
学习 jf
[解决办法]
very good
[解决办法]
[解决办法]
哇是个高手
学习
顶
[解决办法]
UP
[解决办法]
[解决办法]
谢谢分享!顶1个~~
[解决办法]
图像处理我编过,不过没有这么全。学习了,谢谢。
[解决办法]
好贴。。。收藏了。。。
[解决办法]
学习
[解决办法]
不错 顺便说下 狗狗可爱
[解决办法]
学习学习 顺便说下 可爱的狗狗