【图片处理】最全的C#图片处理类ImageHelper.cs
<a target=_blank href="http://bbs.cskin.net/forum.php?mod=viewthread&tid=113&fromuid=2446">http://bbs.cskin.net/forum.php?mod=viewthread&tid=113&fromuid=2446</a>
(出处: CSkin论坛)
一个很完整的图片处理类,包含了14个对图片处理的方法例如:<ul class="litype_1" type="1"><li>生成缩略图、加图片水印和文字水印。</li><li>调整量度、反色、浮雕、拉伸、滤色。</li><li>上下左右翻转、压缩、灰度化、黑白转换。</li><li>获取gif图片种的每一帧。</li></ul>using System;
using System.Collections;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;namespace HelloCsharp.Utilities
{public class ImageClass{public ImageClass(){ }#region 缩略图/// <summary>/// 生成缩略图/// </summary>/// <param name="originalImagePath">源图路径(物理路径)</param>/// <param name="thumbnailPath">缩略图路径(物理路径)</param>/// <param name="width">缩略图宽度</param>/// <param name="height">缩略图高度</param>/// <param name="mode">生成缩略图的方式</param>    public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode){System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);int towidth = width;int toheight = height;int x = 0;int y = 0;int ow = originalImage.Width;int oh = originalImage.Height;switch (mode){case "HW":  //指定高宽缩放(可能变形)                break;case "W":   //指定宽,高按比例                    toheight = originalImage.Height * width / originalImage.Width;break;case "H":   //指定高,宽按比例towidth = originalImage.Width * height / originalImage.Height;break;case "Cut": //指定高宽裁减(不变形)                if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight){oh = originalImage.Height;ow = originalImage.Height * towidth / toheight;y = 0;x = (originalImage.Width - ow) / 2;}else{ow = originalImage.Width;oh = originalImage.Width * height / towidth;x = 0;y = (originalImage.Height - oh) / 2;}break;default:break;}//新建一个bmp图片System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);//新建一个画板System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);//设置高质量插值法g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;//设置高质量,低速度呈现平滑程度g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//清空画布并以透明背景色填充g.Clear(System.Drawing.Color.Transparent);//在指定位置并且按指定大小绘制原图片的指定部分g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel);try{//以jpg格式保存缩略图bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);}catch (System.Exception e){throw e;}finally{originalImage.Dispose();bitmap.Dispose();g.Dispose();}}#endregion#region 图片水印/// <summary>/// 图片水印处理方法/// </summary>/// <param name="path">需要加载水印的图片路径(绝对路径)</param>/// <param name="waterpath">水印图片(绝对路径)</param>/// <param name="location">水印位置(传送正确的代码)</param>public static string ImageWatermark(string path, string waterpath, string location){string kz_name = Path.GetExtension(path);if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg"){DateTime time = DateTime.Now;string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString();Image img = Bitmap.FromFile(path);Image waterimg = Image.FromFile(waterpath);Graphics g = Graphics.FromImage(img);ArrayList loca = GetLocation(location, img, waterimg);g.DrawImage(waterimg, new Rectangle(int.Parse(loca[0].ToString()), int.Parse(loca[1].ToString()), waterimg.Width, waterimg.Height));waterimg.Dispose();g.Dispose();string newpath = Path.GetDirectoryName(path) + filename + kz_name;img.Save(newpath);img.Dispose();File.Copy(newpath, path, true);if (File.Exists(newpath)){File.Delete(newpath);}}return path;}/// <summary>/// 图片水印位置处理方法/// </summary>/// <param name="location">水印位置</param>/// <param name="img">需要添加水印的图片</param>/// <param name="waterimg">水印图片</param>private static ArrayList GetLocation(string location, Image img, Image waterimg){ArrayList loca = new ArrayList();int x = 0;int y = 0;if (location == "LT"){x = 10;y = 10;}else if (location == "T"){x = img.Width / 2 - waterimg.Width / 2;y = img.Height - waterimg.Height;}else if (location == "RT"){x = img.Width - waterimg.Width;y = 10;}else if (location == "LC"){x = 10;y = img.Height / 2 - waterimg.Height / 2;}else if (location == "C"){x = img.Width / 2 - waterimg.Width / 2;y = img.Height / 2 - waterimg.Height / 2;}else if (location == "RC"){x = img.Width - waterimg.Width;y = img.Height / 2 - waterimg.Height / 2;}else if (location == "LB"){x = 10;y = img.Height - waterimg.Height;}else if (location == "B"){x = img.Width / 2 - waterimg.Width / 2;y = img.Height - waterimg.Height;}else{x = img.Width - waterimg.Width;y = img.Height - waterimg.Height;}loca.Add(x);loca.Add(y);return loca;}#endregion#region 文字水印/// <summary>/// 文字水印处理方法/// </summary>/// <param name="path">图片路径(绝对路径)</param>/// <param name="size">字体大小</param>/// <param name="letter">水印文字</param>/// <param name="color">颜色</param>/// <param name="location">水印位置</param>public static string LetterWatermark(string path, int size, string letter, Color color, string location){#regionstring kz_name = Path.GetExtension(path);if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg"){DateTime time = DateTime.Now;string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString();Image img = Bitmap.FromFile(path);Graphics gs = Graphics.FromImage(img);ArrayList loca = GetLocation(location, img, size, letter.Length);Font font = new Font("宋体", size);Brush br = new SolidBrush(color);gs.DrawString(letter, font, br, float.Parse(loca[0].ToString()), float.Parse(loca[1].ToString()));gs.Dispose();string newpath = Path.GetDirectoryName(path) + filename + kz_name;img.Save(newpath);img.Dispose();File.Copy(newpath, path, true);if (File.Exists(newpath)){File.Delete(newpath);}}return path;#endregion}/// <summary>/// 文字水印位置的方法/// </summary>/// <param name="location">位置代码</param>/// <param name="img">图片对象</param>/// <param name="width">宽(当水印类型为文字时,传过来的就是字体的大小)</param>/// <param name="height">高(当水印类型为文字时,传过来的就是字符的长度)</param>private static ArrayList GetLocation(string location, Image img, int width, int height){#regionArrayList loca = new ArrayList();  //定义数组存储位置float x = 10;float y = 10;if (location == "LT"){loca.Add(x);loca.Add(y);}else if (location == "T"){x = img.Width / 2 - (width * height) / 2;loca.Add(x);loca.Add(y);}else if (location == "RT"){x = img.Width - width * height;}else if (location == "LC"){y = img.Height / 2;}else if (location == "C"){x = img.Width / 2 - (width * height) / 2;y = img.Height / 2;}else if (location == "RC"){x = img.Width - height;y = img.Height / 2;}else if (location == "LB"){y = img.Height - width - 5;}else if (location == "B"){x = img.Width / 2 - (width * height) / 2;y = img.Height - width - 5;}else{x = img.Width - width * height;y = img.Height - width - 5;}loca.Add(x);loca.Add(y);return loca;#endregion}#endregion#region 调整光暗/// <summary>/// 调整光暗/// </summary>/// <param name="mybm">原始图片</param>/// <param name="width">原始图片的长度</param>/// <param name="height">原始图片的高度</param>/// <param name="val">增加或减少的光暗值</param>public Bitmap LDPic(Bitmap mybm, int width, int height, int val){Bitmap bm = new Bitmap(width, height);//初始化一个记录经过处理后的图片对象int x, y, resultR, resultG, resultB;//x、y是循环次数,后面三个是记录红绿蓝三个值的Color pixel;for (x = 0; x < width; x++){for (y = 0; y < height; y++){pixel = mybm.GetPixel(x, y);//获取当前像素的值resultR = pixel.R + val;//检查红色值会不会超出[0, 255]resultG = pixel.G + val;//检查绿色值会不会超出[0, 255]resultB = pixel.B + val;//检查蓝色值会不会超出[0, 255]bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));//绘图}}return bm;}#endregion#region 反色处理/// <summary>/// 反色处理/// </summary>/// <param name="mybm">原始图片</param>/// <param name="width">原始图片的长度</param>/// <param name="height">原始图片的高度</param>public Bitmap RePic(Bitmap mybm, int width, int height){Bitmap bm = new Bitmap(width, height);//初始化一个记录处理后的图片的对象int x, y, resultR, resultG, resultB;Color pixel;for (x = 0; x < width; x++){for (y = 0; y < height; y++){pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值resultR = 255 - pixel.R;//反红resultG = 255 - pixel.G;//反绿resultB = 255 - pixel.B;//反蓝bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));//绘图}}return bm;}#endregion#region 浮雕处理/// <summary>/// 浮雕处理/// </summary>/// <param name="oldBitmap">原始图片</param>/// <param name="Width">原始图片的长度</param>/// <param name="Height">原始图片的高度</param>public Bitmap FD(Bitmap oldBitmap, int Width, int Height){Bitmap newBitmap = new Bitmap(Width, Height);Color color1, color2;for (int x = 0; x < Width - 1; x++){for (int y = 0; y < Height - 1; y++){int r = 0, g = 0, b = 0;color1 = oldBitmap.GetPixel(x, y);color2 = oldBitmap.GetPixel(x + 1, y + 1);r = Math.Abs(color1.R - color2.R + 128);g = Math.Abs(color1.G - color2.G + 128);b = Math.Abs(color1.B - color2.B + 128);if (r > 255) r = 255;if (r < 0) r = 0;if (g > 255) g = 255;if (g < 0) g = 0;if (b > 255) b = 255;if (b < 0) b = 0;newBitmap.SetPixel(x, y, Color.FromArgb(r, g, b));}}return newBitmap;}#endregion#region 拉伸图片/// <summary>/// 拉伸图片/// </summary>/// <param name="bmp">原始图片</param>/// <param name="newW">新的宽度</param>/// <param name="newH">新的高度</param>public static Bitmap ResizeImage(Bitmap bmp, int newW, int newH){try{Bitmap bap = new Bitmap(newW, newH);Graphics g = Graphics.FromImage(bap);g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;g.DrawImage(bap, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bap.Width, bap.Height), GraphicsUnit.Pixel);g.Dispose();return bap;}catch{return null;}}#endregion#region 滤色处理/// <summary>/// 滤色处理/// </summary>/// <param name="mybm">原始图片</param>/// <param name="width">原始图片的长度</param>/// <param name="height">原始图片的高度</param>public Bitmap FilPic(Bitmap mybm, int width, int height){Bitmap bm = new Bitmap(width, height);//初始化一个记录滤色效果的图片对象int x, y;Color pixel;for (x = 0; x < width; x++){for (y = 0; y < height; y++){pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值bm.SetPixel(x, y, Color.FromArgb(0, pixel.G, pixel.B));//绘图}}return bm;}#endregion#region 左右翻转/// <summary>/// 左右翻转/// </summary>/// <param name="mybm">原始图片</param>/// <param name="width">原始图片的长度</param>/// <param name="height">原始图片的高度</param>public Bitmap RevPicLR(Bitmap mybm, int width, int height){Bitmap bm = new Bitmap(width, height);int x, y, z; //x,y是循环次数,z是用来记录像素点的x坐标的变化的Color pixel;for (y = height - 1; y >= 0; y--){for (x = width - 1, z = 0; x >= 0; x--){pixel = mybm.GetPixel(x, y);//获取当前像素的值bm.SetPixel(z++, y, Color.FromArgb(pixel.R, pixel.G, pixel.B));//绘图}}return bm;}#endregion#region 上下翻转/// <summary>/// 上下翻转/// </summary>/// <param name="mybm">原始图片</param>/// <param name="width">原始图片的长度</param>/// <param name="height">原始图片的高度</param>public Bitmap RevPicUD(Bitmap mybm, int width, int height){Bitmap bm = new Bitmap(width, height);int x, y, z;Color pixel;for (x = 0; x < width; x++){for (y = height - 1, z = 0; y >= 0; y--){pixel = mybm.GetPixel(x, y);//获取当前像素的值bm.SetPixel(x, z++, Color.FromArgb(pixel.R, pixel.G, pixel.B));//绘图}}return bm;}#endregion#region 压缩图片/// <summary>/// 压缩到指定尺寸/// </summary>/// <param name="oldfile">原文件</param>/// <param name="newfile">新文件</param>public bool Compress(string oldfile, string newfile){try{System.Drawing.Image img = System.Drawing.Image.FromFile(oldfile);System.Drawing.Imaging.ImageFormat thisFormat = img.RawFormat;Size newSize = new Size(100, 125);Bitmap outBmp = new Bitmap(newSize.Width, newSize.Height);Graphics g = Graphics.FromImage(outBmp);g.CompositingQuality = CompositingQuality.HighQuality;g.SmoothingMode = SmoothingMode.HighQuality;g.InterpolationMode = InterpolationMode.HighQualityBicubic;g.DrawImage(img, new Rectangle(0, 0, newSize.Width, newSize.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);g.Dispose();EncoderParameters encoderParams = new EncoderParameters();long[] quality = new long[1];quality[0] = 100;EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);encoderParams.Param[0] = encoderParam;ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();ImageCodecInfo jpegICI = null;for (int x = 0; x < arrayICI.Length; x++)if (arrayICI[x].FormatDescription.Equals("JPEG")){jpegICI = arrayICI[x]; //设置JPEG编码break;}img.Dispose();if (jpegICI != null) outBmp.Save(newfile, System.Drawing.Imaging.ImageFormat.Jpeg);outBmp.Dispose();return true;}catch{return false;}}#endregion#region 图片灰度化public Color Gray(Color c){int rgb = Convert.ToInt32((double)(((0.3 * c.R) + (0.59 * c.G)) + (0.11 * c.B)));return Color.FromArgb(rgb, rgb, rgb);}#endregion#region 转换为黑白图片/// <summary>/// 转换为黑白图片/// </summary>/// <param name="mybt">要进行处理的图片</param>/// <param name="width">图片的长度</param>/// <param name="height">图片的高度</param>public Bitmap BWPic(Bitmap mybm, int width, int height){Bitmap bm = new Bitmap(width, height);int x, y, result; //x,y是循环次数,result是记录处理后的像素值Color pixel;for (x = 0; x < width; x++){for (y = 0; y < height; y++){pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值result = (pixel.R + pixel.G + pixel.B) / 3;//取红绿蓝三色的平均值bm.SetPixel(x, y, Color.FromArgb(result, result, result));}}return bm;}#endregion#region 获取图片中的各帧/// <summary>/// 获取图片中的各帧/// </summary>/// <param name="pPath">图片路径</param>/// <param name="pSavePath">保存路径</param>public void GetFrames(string pPath, string pSavedPath){Image gif = Image.FromFile(pPath);FrameDimension fd = new FrameDimension(gif.FrameDimensionsList[0]);int count = gif.GetFrameCount(fd); //获取帧数(gif图片可能包含多帧,其它格式图片一般仅一帧)for (int i = 0; i < count; i++)    //以Jpeg格式保存各帧{gif.SelectActiveFrame(fd, i);gif.Save(pSavedPath + "\\frame_" + i + ".jpg", ImageFormat.Jpeg);}}#endregion}
}

最全的C#图片处理类ImageHelper.cs相关推荐

  1. 最全的C#图片处理类ImageHelper.cs(个人保留)

    一个很完整的图片处理类,包含了14个对图片处理的方法例如:<ul class="litype_1" type="1"><li>生成缩略图 ...

  2. 最全的C#图片处理帮助类ImageHelper

    最全的C#图片处理帮助类ImageHelper.cs 方法介绍: 生成缩略图 图片水印处理方法 图片水印位置处理方法 文字水印处理方法 文字水印位置的方法 调整光暗 反色处理 浮雕处理 拉伸图片 滤色 ...

  3. 仿照七牛云图片处理类实现的C#帮助类

    介绍 Sop.Common.Img 请看 七牛云的图片处理功能介绍文档了解本项目功能 此项目是有https://github.com/Sopcce/.Net-Common-Utility中的一个小部分 ...

  4. 图片转字符图片工具类

    ├── cn.xsshome.imagetool //包名├── convert │ └── ImageToChar //图片转字符图片.文本方法 ├── slideverifycode │ └── ...

  5. Android Handler 异步消息处理机制的妙用 创建强大的图片载入类

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 近期创建了一个群.方便大家交流,群号: ...

  6. 如何给屏幕设置一个充满全屏的图片

    如何给屏幕设置一个充满全屏的图片 html{ width:100%; height:100%; overflow:hidden; } body{ background:url("bg_1.p ...

  7. php图片是啥,php图片处理类(附实例)

    分享一个php实现的图片处理类,可以设置文字水印与图片水印等,有需要的朋友参考下. 本节分享一个图片处理类,简单实现了文字水印与图片水印,是学习php图片操作的小例子. 代码: image = new ...

  8. php 图片 处理,php图片处理类

    本篇文章主要介绍php图片处理类,感兴趣的朋友参考下,希望对大家有所帮助. 示例代码如下:<?php /*已知问题:1.在图片缩放功能中,使用imagecreatetruecolor函数创建画布 ...

  9. wordpress 背景_如何在WordPress中添加全屏背景图片

    wordpress 背景 Full screen background image seems to be a new design trend that is becoming fashionabl ...

最新文章

  1. Spring Cloud - Feign调用问题
  2. 同步文件,不需要密码
  3. 使用Hyper-V安装Ubuntu16.04 Server 网络配置
  4. oracle 存储 更新,oracle 更新空间数据存储过程语句
  5. FreeSql (二十八)事务
  6. iso图像测试卡_4700万像素 五轴防抖 徕卡正式发布SL2无反相机
  7. java定义接口规范_关于java的接口的一些规范
  8. Python---(9)数据科学领域常用的15个Python包
  9. ios html特殊符号转化,iOS HTML特殊字符转译
  10. 【百度地图API】圣诞节里不会迷路的麋鹿——驾车导航
  11. JQuery window、document、 body
  12. SQL 获取当前日期
  13. 流氓软件mcafee之Mac端卸载
  14. linux(ubantu)系统如何安装vim编辑器以及如何使用vim
  15. git 解决授权失败的方法
  16. Python编程基础的应用
  17. FPGA的进阶项目——开源示波器
  18. Global Tracking Transformers 详细解读
  19. 从1.0到4.0,酒类新零售还能跑出几个1919和酒仙网?
  20. CAD数据文件格式DXF部分实体(圆弧、椭圆、凸度)解析[原理讲解+公式推导+java实现]

热门文章

  1. 类加载的三个阶段——加载、链接以及初始化,类的主动使用和被动使用
  2. Tomcat服务器环境配置--查看bat文件(解决Neither the JAVA_HOME nor the JRE_HOME environment variable is defined问题)
  3. 根据HttpServletRequest request 获取当前用户ip地址和ip所属区域
  4. Duplicate Strings 字符串 取模 牛客练习赛95
  5. Consecutive Sum Riddle(800)
  6. vue教程2:vue基础
  7. 3级联动 ajax java_ajax实现三级联动的基本方法
  8. 史上最详细Docker安装Redis (含每一步的图解)实战
  9. 发送请求_发送soap请求调用wsdl服务
  10. mysql的hash分区_MySQL中的分区(五)HASH分区