无法在这个位置找到: head2.htm
当前位置: 建站首页 > 凡科概况 >

网站制作软件

时间:2020-12-30 12:35来源:网站制作软件 作者:jianzhan 点击:
网站制作软件:C#图片处理3种高级应用 C#图片处理3种高级应用 更新2015年10月14日 作者:吴剑 本文介绍C#图片处理高级应用,这些功能并无多大技术含量。全部基于.Net Framework类库完

网站制作软件:C#图片处理3种高级应用

C#图片处理3种高级应用  更新2015年10月14日   作者:吴剑   本文介绍C#图片处理高级应用,这些功能并无多大技术含量。全部基于.Net Framework类库完成,代码中包含了C#图片处理的一些基础知识,与大家分享,个人能力有限,不足之处还请及时指正。

利用C#图片处理的一些基本和高级应用,解决了显示排版时想让相片缩略图列表非常统一、整齐、和美观,每张缩略图大小固定为120 x 90且不拉伸变形,用户头像让缩略图比原图更清晰,上传的图片下加一个半透明的LOGO水印等等要求。
高缩略图清晰度

之前一直认为缩略图不可能比原图清晰,直到某天一位产品的同事给我看某网站的效果。于是开始寻找.NET下实现代码,仔细观察缩略图确实比原图更清晰了一些,但代价是缩略图文件比原图更大,所以如果你想让一张占满显示器屏幕的超大图片更清晰,那么图片占用空间和网络流量就必需考虑了,如果是互联网应用,建议缩略图在200像素以内的使用该方法。当然如果哪位有更好的代码即能让图片文件大小变化不大又让图片更清晰还请分享。

图片剪裁

 

算法:以原图中心作为裁剪中心,最大范围的对原图进行裁剪,然后对裁剪结果等比缩放。

图片水印

详细代码:

封装了几个通用的方法,如发现有BUG或漏洞还请及时指正。

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace WuJian.Common
 public class Image
 #region 正方型裁剪并缩放
 /// summary 
 /// 正方型裁剪
 /// 以图片中心为轴心,截取正方型,然后等比缩放
 /// 用于头像处理
 /// /summary 
 /// remarks 吴剑  /remarks 
 /// param name="fromFile" 原图Stream对象 /param 
 /// param name="fileSaveUrl" 缩略图存放地址 /param 
 /// param name="side" 指定的边长(正方型) /param 
 /// param name="quality" 质量(范围0-100) /param 
 public static void CutForSquare(System.IO.Stream fromFile, string fileSaveUrl, int side, int quality)
 //创建目录
 string dir = Path.GetDirectoryName(fileSaveUrl);
 if (!Directory.Exists(dir))
 Directory.CreateDirectory(dir);
 //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
 System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
 //原图宽高均小于模版,不作处理,直接保存
 if (initImage.Width = side initImage.Height = side)
 initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
 else
 //原始图片的宽、高
 int initWidth = initImage.Width;
 int initHeight = initImage.Height;
 //非正方型先裁剪为正方型
 if (initWidth != initHeight)
 //截图对象
 System.Drawing.Image pickedImage = null;
 System.Drawing.Graphics pickedG = null;
 //宽大于高的横图
 if (initWidth initHeight)
 //对象实例化
 pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
 pickedG = System.Drawing.Graphics.FromImage(pickedImage);
 //设置质量
 pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
 pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 //定位
 Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
 Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
 //画图
 pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
 //重置宽
 initWidth = initHeight;
 //高大于宽的竖图
 else
 //对象实例化
 pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
 pickedG = System.Drawing.Graphics.FromImage(pickedImage);
 //设置质量
 pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
 pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 //定位
 Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
 Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
 //画图
 pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
 //重置高
 initHeight = initWidth;
 //将截图对象赋给原图
 initImage = (System.Drawing.Image)pickedImage.Clone();
 //释放截图资源
 pickedG.Dispose();
 pickedImage.Dispose();
 //缩略图对象
 System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
 System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
 //设置质量
 resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
 resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 //用指定背景色清空画布
 resultG.Clear(Color.White);
 //绘制缩略图
 resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);
 //关键质量控制
 //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
 ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
 ImageCodecInfo ici = null;
 foreach (ImageCodecInfo i in icis)
 if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
 ici = i;
 EncoderParameters ep = new EncoderParameters(1);
 ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
 //保存缩略图
 resultImage.Save(fileSaveUrl, ici, ep);
 //释放关键质量控制所用资源
 ep.Dispose();
 //释放缩略图资源
 resultG.Dispose();
 resultImage.Dispose();
 //释放原始图片资源
 initImage.Dispose();
 #endregion
 #region 自定义裁剪并缩放
 /// summary 
 /// 指定长宽裁剪
 /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸
 /// /summary 
 /// remarks 吴剑  /remarks 
 /// param name="fromFile" 原图Stream对象 /param 
 /// param name="fileSaveUrl" 保存路径 /param 
 /// param name="maxWidth" 最大宽(单位:px) /param 
 /// param name="maxHeight" 最大高(单位:px) /param 
 /// param name="quality" 质量(范围0-100) /param 
 public static void CutForCustom(System.IO.Stream fromFile, string fileSaveUrl, int maxWidth, int maxHeight, int quality)
 //从文件获取原始图片,并使用流中嵌入的颜色管理信息
 System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
 //原图宽高均小于模版,不作处理,直接保存
 if (initImage.Width = maxWidth initImage.Height = maxHeight)
 initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
 else
 //模版的宽高比例
 double templateRate = (double)maxWidth / maxHeight;
 //原图片的宽高比例
 double initRate = (double)initImage.Width / initImage.Height;
 //原图与模版比例相等,直接缩放
 if (templateRate == initRate)
 //按模版大小生成最终图片
 System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
 System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
 templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
 templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 templateG.Clear(Color.White);
 templateG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
 templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
 //原图与模版比例不等,裁剪后缩放
 else
 //裁剪对象
 System.Drawing.Image pickedImage = null;
 System.Drawing.Graphics pickedG = null;
 //定位
 Rectangle fromR = new Rectangle(0, 0, 0, 0);//原图裁剪定位
 Rectangle toR = new Rectangle(0, 0, 0, 0);//目标定位
 //宽为标准进行裁剪
 if (templateRate initRate)
 //裁剪对象实例化
 pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)System.Math.Floor(initImage.Width / templateRate));
 pickedG = System.Drawing.Graphics.FromImage(pickedImage);
 //裁剪源定位
 fromR.X = 0;
 fromR.Y = (int)System.Math.Floor((initImage.Height - initImage.Width / templateRate) / 2);
 fromR.Width = initImage.Width;
 fromR.Height = (int)System.Math.Floor(initImage.Width / templateRate);
 //裁剪目标定位
 toR.X = 0;
 toR.Y = 0;
 toR.Width = initImage.Width;
 toR.Height = (int)System.Math.Floor(initImage.Width / templateRate);
 //高为标准进行裁剪
 else
 pickedImage = new System.Drawing.Bitmap((int)System.Math.Floor(initImage.Height * templateRate), initImage.Height);
 pickedG = System.Drawing.Graphics.FromImage(pickedImage);
 fromR.X = (int)System.Math.Floor((initImage.Width - initImage.Height * templateRate) / 2);
 fromR.Y = 0;
 fromR.Width = (int)System.Math.Floor(initImage.Height * templateRate);
 fromR.Height = initImage.Height;
 toR.X = 0;
 toR.Y = 0;
 toR.Width = (int)System.Math.Floor(initImage.Height * templateRate);
 toR.Height = initImage.Height;
 //设置质量
 pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
 pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 //裁剪
 pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
 //按模版大小生成最终图片
 System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);
 System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);
 templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
 templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 templateG.Clear(Color.White);
 templateG.DrawImage(pickedImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, pickedImage.Width, pickedImage.Height), System.Drawing.GraphicsUnit.Pixel);
 //关键质量控制
 //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff
 ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
 ImageCodecInfo ici = null;
 foreach (ImageCodecInfo i in icis)
 if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
 ici = i;
 EncoderParameters ep = new EncoderParameters(1);
 ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
 //保存缩略图
 templateImage.Save(fileSaveUrl, ici, ep);
 //templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
 //释放资源
 templateG.Dispose();
 templateImage.Dispose();
 pickedG.Dispose();
 pickedImage.Dispose();
 //释放资源
 initImage.Dispose();
 #endregion
 #region 等比缩放
 /// summary 
 /// 图片等比缩放
 /// /summary 
 /// remarks 吴剑  /remarks 
 /// param name="fromFile" 原图Stream对象 /param 
 /// param name="savePath" 缩略图存放地址 /param 
 /// param name="targetWidth" 指定的最大宽度 /param 
 /// param name="targetHeight" 指定的最大高度 /param 
 /// param name="watermarkText" 水印文字(为""表示不使用水印) /param 
 /// param name="watermarkImage" 水印图片路径(为""表示不使用水印) /param 
 public static void ZoomAuto(System.IO.Stream fromFile, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)
 //创建目录
 string dir = Path.GetDirectoryName(savePath);
 if (!Directory.Exists(dir))
 Directory.CreateDirectory(dir);
 //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
 System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
 //原图宽高均小于模版,不作处理,直接保存
 if (initImage.Width = targetWidth initImage.Height = targetHeight)
 //文字水印
 if (watermarkText != "")
 using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(initImage))
 System.Drawing.Font fontWater = new Font("黑体", 10);
 System.Drawing.Brush brushWater = new SolidBrush(Color.White);
 gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
 gWater.Dispose();
 //透明图片水印
 if (watermarkImage != "")
 if (File.Exists(watermarkImage))
 //获取水印图片
 using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))
 //水印绘制条件:原始图片宽高均大于或等于水印图片
 if (initImage.Width = wrImage.Width initImage.Height = wrImage.Height)
 Graphics gWater = Graphics.FromImage(initImage);
 //透明属性
 ImageAttributes imgAttributes = new ImageAttributes();
 ColorMap colorMap = new ColorMap();
 colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
 colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
 ColorMap[] remapTable = { colorMap };
 imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
 float[][] colorMatrixElements = { 
 new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
 new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
 new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
 new float[] {0.0f, 0.0f, 0.0f, 0.5f, 0.0f},//透明度:0.5
 new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
 ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
 imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
 gWater.DrawImage(wrImage, new Rectangle(initImage.Width - wrImage.Width, initImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), 0, 0, wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);
 gWater.Dispose();
 wrImage.Dispose();
 //保存
 initImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
 else
 //缩略图宽、高计算
 double newWidth = initImage.Width;
 double newHeight = initImage.Height;
 //宽大于高或宽等于高(横图或正方)
 if (initImage.Width initImage.Height || initImage.Width == initImage.Height)
 //如果宽大于模版
 if (initImage.Width targetWidth)
 //宽按模版,高按比例缩放
 newWidth = targetWidth;
 newHeight = initImage.Height * (targetWidth / initImage.Width);
 //高大于宽(竖图)
 else
 //如果高大于模版
 if (initImage.Height targetHeight)
 //高按模版,宽按比例缩放
 newHeight = targetHeight;
 newWidth = initImage.Width * (targetHeight / initImage.Height);
 //生成新图
 //新建一个bmp图片
 System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight);
 //新建一个画板
 System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
 //设置质量
 newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
 newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 //置背景色
 newG.Clear(Color.White);
 //画图
 newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
 //文字水印
 if (watermarkText != "")
 using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(newImage))
 System.Drawing.Font fontWater = new Font("宋体", 10);
 System.Drawing.Brush brushWater = new SolidBrush(Color.White);
 gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
 gWater.Dispose();
 //透明图片水印
 if (watermarkImage != "")
 if (File.Exists(watermarkImage))
 //获取水印图片
 using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))
 //水印绘制条件:原始图片宽高均大于或等于水印图片
 if (newImage.Width = wrImage.Width newImage.Height = wrImage.Height)
 Graphics gWater = Graphics.FromImage(newImage);
 //透明属性
 ImageAttributes imgAttributes = new ImageAttributes();
 ColorMap colorMap = new ColorMap();
 colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
 colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
 ColorMap[] remapTable = { colorMap };
 imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
 float[][] colorMatrixElements = { 
 new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
 new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
 new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
 new float[] {0.0f, 0.0f, 0.0f, 0.5f, 0.0f},//透明度:0.5
 new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
 ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
 imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
 gWater.DrawImage(wrImage, new Rectangle(newImage.Width - wrImage.Width, newImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), 0, 0, wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);
 gWater.Dispose();
 wrImage.Dispose();
 //保存缩略图
 newImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
 //释放资源
 newG.Dispose();
 newImage.Dispose();
 initImage.Dispose();
 #endregion
 #region 其它
 /// summary 
 /// 判断文件类型是否为WEB格式图片
 /// (注:JPG,GIF,BMP,PNG)
 /// /summary 
 /// param name="contentType" HttpPostedFile.ContentType /param 
 /// returns /returns 
 public static bool IsWebImage(string contentType)
 if (contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmp" || contentType == "image/png")
 return true;
 else
 return false;
 #endregion
 }//end class

以上就是C#图片处理的高级应用,希望对大家的学习有所帮助。


相关文章

这篇文章主要介绍了在多线程中调用winform窗体控件的实现方法,需要的朋友可以参考下

本文主要介绍通过引用Adobe reader提供的COM组件,以实现在WinForm程序中显示PDF文件的功能。

这篇文章主要介绍了基于C#代码实现九宫格算法横竖都等于4的相关资料,需要的朋友可以参考下

本篇文章是对Object转为String的几种简易形式进行了详细的分析介绍,需要的朋友参考下

这篇文章主要介绍了C#隐藏控制台键盘输入的方法,涉及C#针对系统底层调用的相关技巧,非常具有实用价值,需要的朋友可以参考下

这篇文章主要介绍了C#中4种深拷贝方法介绍,本文讲解了利用反射实现、利用xml序列化和反序列化实现、利用二进制序列化和反序列化实现、利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用等4种方法,需要的朋友可以参考下

本篇文章介绍了,BarCode条形码基于C# GDI+ 的实现方法详解。需要的朋友参考下

本文给大家分享的是C#识别出图片里的数字和字母的代码,主要是识别以前公司的软件注册码截图里的数字和字母,功能很简单,也存在很大的局限性,这里仅仅是分享,小伙伴们参考下。

C#基础概念二十五问 21-25...

这篇文章介绍了C#启动和停止windows服务的实例代码,有需要的朋友可以参考一下 (责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
无法在这个位置找到: ajaxfeedback.htm
栏目列表
推荐内容


扫描二维码分享到微信