首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[分享][代码][放分]C# 简单图像处理类,该怎么解决

2012-02-15 
[分享][代码][放分]C# 简单图像处理类今天在CodeProject上找到这篇文章,还算实用,不敢独享,送给大家!原文

[分享][代码][放分]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个~~
[解决办法]
图像处理我编过,不过没有这么全。学习了,谢谢。
[解决办法]
好贴。。。收藏了。。。
[解决办法]
学习
[解决办法]
不错 顺便说下 狗狗可爱
[解决办法]
学习学习 顺便说下 可爱的狗狗

热点排行