[分享][代码][放分]C# 简单图像处理类

龙宜坡 2009-04-20 12:52:56
加精
今天在CodeProject上找到这篇文章,还算实用,不敢独享,送给大家!


原文地址
示例下载
源码下载(VS2005)

简介
...

概述
这篇文章的目的是构建一个图像处理功能的类而使每一个C#程序员都能够使用。因为使用C#能够非常灵活的进行图像处理。
我们知道,当基于计算来移动像素或改变像素值的代码稍微有点复杂。

应用

ImageHandler类负责图像处理的相关操作,如保存、图像关联操作等。功能包括:获取图片信息、
缩放、色彩滤镜、亮度、反向、灰度、转换、裁贴、和插入文字、其它图片或几何图形。
Paint方法使用AutoScoolPosition属性发现滚动位置,使用AutoScrollMinSize属性进行设置。

1.Color Filter(色相)
关于色相的说明:
  从光学意义上讲,色相差别是由光波波长的长短产生的。即便是同一类颜色,也能分为几种色相,如黄颜色可以分为中黄、土黄、
柠檬黄等,灰颜色则可以分为红灰、蓝灰、紫灰等。光谱中有红、橙、黄、绿、蓝、紫六种基本色光,人的眼睛可以 分辨出约180种不同色相的颜色。
颜色过滤是依照颜色的光谱吸收类别:短波长、长波长、混合波长;合并或形状裁贴;单色或变色的。
详见:http://baike.baidu.com/view/122648.htm

这个比较简单,只需要增加或减少每种颜色的值即可。
使图片中的另外两种颜色值减去255即可。比如,红色相中,保持红色值不变,而对绿色和蓝色分别减去255即可。





/// <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



        /// <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;
}


...全文
12316 376 打赏 收藏 转发到动态 举报
写回复
用AI写文章
376 条回复
切换为时间正序
请发表友善的回复…
发表回复
着魔 2012-10-29
  • 打赏
  • 举报
回复
谢谢楼主分享
liups 2012-10-28
  • 打赏
  • 举报
回复
收藏,学习
gq198718 2012-10-22
  • 打赏
  • 举报
回复
收ia收下了,
彳卸风 2012-05-25
  • 打赏
  • 举报
回复
收下了
wdw12zy 2012-05-17
  • 打赏
  • 举报
回复
楼主下载不了 能不能发到我的邮箱上来啊 谢谢
wdw0208zy@163.com
qingfy2007 2012-05-13
  • 打赏
  • 举报
回复
感谢楼主分享!

^ _ ^
Allen__Jo 2012-04-29
  • 打赏
  • 举报
回复
要是有图片旋转的就更完美了
yky126 2012-04-27
  • 打赏
  • 举报
回复
厉害!楼主
wzuomin 2012-04-17
  • 打赏
  • 举报
回复
确实不错,我要好好研究研究了,好好。。
吹风的兔子 2012-02-01
  • 打赏
  • 举报
回复
收藏了....
羊羽亻子 2012-02-01
  • 打赏
  • 举报
回复
这个无限牛B,要顶
dlmuxp 2011-11-12
  • 打赏
  • 举报
回复
很有用啊,谢谢
ANSEMY 2011-09-08
  • 打赏
  • 举报
回复
好帖~谢谢楼主~
牛皮蛙 2011-07-20
  • 打赏
  • 举报
回复
很有启发性,谢谢了~
hobpy 2011-07-13
  • 打赏
  • 举报
回复
马克了
m_s123 2011-06-20
  • 打赏
  • 举报
回复
感谢LZ分享....
BurgessLi 2011-06-02
  • 打赏
  • 举报
回复
是个好东西,谢谢分享
qq373999217 2011-06-02
  • 打赏
  • 举报
回复
upupupupupupu111
Stevehai812 2011-06-02
  • 打赏
  • 举报
回复
顶一个!!!!!!!!!!!!!!!!!
xushiluo 2011-05-29
  • 打赏
  • 举报
回复
很好,学习了!
加载更多回复(341)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧