Image图片处理
- public class Imager
- {
- #region 正方型裁剪并缩放
- /// <summary>
- /// 正方型裁剪
- /// 以图片中心为轴心,截取正方型,然后等比缩放
- /// 用于头像处理
- /// </summary>
- /// <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) / , , initHeight, initHeight);
- Rectangle toR = new Rectangle(, , 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(, (initHeight - initWidth) / , initWidth, initWidth);
- Rectangle toR = new Rectangle(, , 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(, , side, side), new System.Drawing.Rectangle(, , 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();
- ep.Param[] = 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>
- /// <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 {
- if (maxWidth == ) maxWidth = initImage.Width;
- if (maxHeight == ) maxHeight = initImage.Height;
- //模版的宽高比例
- 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(, , maxWidth, maxHeight), new System.Drawing.Rectangle(, , 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(, , , );//原图裁剪定位
- Rectangle toR = new Rectangle(, , , );//目标定位
- //宽为标准进行裁剪
- 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 = ;
- fromR.Y = (int)System.Math.Floor((initImage.Height - initImage.Width / templateRate) / );
- fromR.Width = initImage.Width;
- fromR.Height = (int)System.Math.Floor(initImage.Width / templateRate);
- //裁剪目标定位
- toR.X = ;
- toR.Y = ;
- 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) / );
- fromR.Y = ;
- fromR.Width = (int)System.Math.Floor(initImage.Height * templateRate);
- fromR.Height = initImage.Height;
- toR.X = ;
- toR.Y = ;
- 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(, , maxWidth, maxHeight), new System.Drawing.Rectangle(, , 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();
- ep.Param[] = 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
- /// <summary>
- /// 图片等比缩放
- /// </summary>
- /// <param name="filePath">原图Stream对象</param>
- /// <param name="targetPath">缩略图存放地址</param>
- /// <param name="targetWidth">指定的最大宽度</param>
- /// <param name="targetHeight">指定的最大高度</param>
- /// <param name="watermarkText">水印文字(为""表示不使用水印)</param>
- /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param>
- public static void Resize(string filePath, string targetPath, double targetWidth, double targetHeight, string watermarkText = "", string watermarkImage = "")
- {
- //创建目录
- string dir = Path.GetDirectoryName(targetPath);
- if (Directory.Exists(dir) == false) Directory.CreateDirectory(dir);
- //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
- Image initImage = Image.FromFile(filePath, true);
- //原图宽高均小于模版或目标宽度均为0,不作处理,直接保存
- if (initImage.Width <= targetWidth && initImage.Height <= targetHeight || (targetWidth == && targetHeight == )) {
- //文字水印
- if (watermarkText != "") {
- setWatermarkText(initImage, watermarkText);
- }
- //透明图片水印
- if (watermarkImage != "") {
- setWatermarkImage(initImage, watermarkImage);
- }
- //保存
- initImage.Save(targetPath, ImageFormat.Jpeg);
- } else {
- //缩略图宽、高计算
- double newWidth = ;
- double newHeight = ;
- if (targetWidth == ) {
- newWidth = initImage.Width * targetHeight / initImage.Height;
- newHeight = targetHeight;
- } else if(targetHeight == ) {
- newWidth = targetWidth;
- newHeight = initImage.Height * targetWidth / initImage.Width;
- } else {
- double scaleWidth = targetWidth / initImage.Width;
- double scaleHeight = targetHeight / initImage.Height;
- if (scaleWidth > scaleHeight) {
- newWidth = initImage.Width * scaleHeight;
- newHeight = initImage.Height * scaleHeight;
- } else {
- newWidth = initImage.Width * scaleWidth;
- newHeight = initImage.Height * scaleWidth;
- }
- }
- //生成新图
- //新建一个bmp图片
- Image newImage = new Bitmap((int)newWidth, (int)newHeight);
- //新建一个画板
- Graphics newG = Graphics.FromImage(newImage);
- //设置质量
- newG.InterpolationMode = InterpolationMode.HighQualityBicubic;
- newG.SmoothingMode = SmoothingMode.HighQuality;
- //置背景色
- newG.Clear(Color.White);
- //画图
- newG.DrawImage(initImage, new Rectangle(, , newImage.Width, newImage.Height), new Rectangle(, , initImage.Width, initImage.Height), GraphicsUnit.Pixel);
- //文字水印
- if (watermarkText != "") {
- setWatermarkText(newImage, watermarkText);
- }
- //透明图片水印
- if (watermarkImage != "") {
- setWatermarkImage(newImage, watermarkImage);
- }
- //保存缩略图
- newImage.Save(targetPath, ImageFormat.Jpeg);
- //释放资源
- newG.Dispose();
- newImage.Dispose();
- }
- initImage.Dispose();
- }
- private static void setWatermarkText(Image initImage, string watermarkText)
- {
- using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(initImage)) {
- System.Drawing.Font fontWater = new Font("黑体", );
- System.Drawing.Brush brushWater = new SolidBrush(Color.White);
- gWater.DrawString(watermarkText, fontWater, brushWater, , );
- gWater.Dispose();
- }
- }
- private static void setWatermarkImage(Image initImage, string 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(, , , );
- colorMap.NewColor = Color.FromArgb(, , , );
- 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), , , wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);
- gWater.Dispose();
- }
- wrImage.Dispose();
- }
- }
- }
- }
Image图片处理的更多相关文章
- webp图片实践之路
最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...
- CSS3 background-image背景图片相关介绍
这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...
- Asp.Net Mvc 使用WebUploader 多图片上传
来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...
- Markdown 图片助手-MarkdownPicPicker
title: Markdown 图片助手 v0.1 toc: true comments: true date: 2016-06-04 16:40:06 tags: [Python, Markdown ...
- 图片访问实时处理的实现(nodejs和php)
我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- HTML中上传与读取图片或文件(input file)----在路上(25)
input file相关知识简例 在此介绍的input file相关知识为: 上传照片及文件,其中包括单次上传.批量上传.删除照片.增加照片.读取图片.对上传的图片或文件的判断,比如限制图片的张数.限 ...
随机推荐
- Python-Day07-图形用户界面和游戏开发
Python-100Day-学习打卡Author: Seven_0507Date: 2019-05-22123 文章目录Python图形用户界面和游戏开发1. tkinter模块2. Pygame进行 ...
- CSS 类名的问题
以下以数字开头的 CSS 类名不会生效: .1st{ color: red; } 一个合法的 CSS 类名必需以下面其中之一作为开头: 下划线 _ 短横线 - 字母 a-z 然后紧跟其他 _,- 数字 ...
- 02Oracle Database 安装,卸载,系统服务,系统组件及系统表空间
Oracle Database 安装,卸载,系统服务,系统组件及系统表空间 Oracle Database 安装 Oracle Database 卸载 Oracle Database 系统服务 Ora ...
- Deepin系统关于每次启动终端都要输入source /etc/profile的问题
关于每次启动终端都要输入source /etc/profile的问题 当我在Deepin系统中下载了node以及npm之后,我为了将node导入到系统文件,使用了以下命令sudo gedit ``/e ...
- 洛谷——P2420 让我们异或吧
P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...
- 牛客练习赛25 C 再编号
解题思路 我们先来观察一下题目中给出的公式 $$a'_i=(\sum_{j=1}^na_j)-a_i$$ 通过这个公式推一下经过再编号后的序列的总和,因为我们推出这个和之后可以进行下一次计算. $$\ ...
- Python使用Flask框架,结合Highchart处理csv数据(引申-从文件获取数据--从数据库获取数据)
参考链接:https://www.highcharts.com.cn/docs/process-text-data-file 1.javascript代码 var options = { chart: ...
- AWK简单使用方法
1. 命令格式 gawk [OPTIONS] 'program' FILES.... program:'PATTERN{ACTION}' 一条awk命令中,PATTERN和ACTION,至少存在一个才 ...
- git帮助网址
http://rogerdudler.github.io/git-guide/index.zh.html https://help.github.com/
- PyCharm开发GUI之PyQt安装
开发环境 PyCharm 2018.3.3python3.7 1 安装pyqt5 pip install PyQt5-tools 2 配置PyCharm 2.1 配置设计器 其中,program为C: ...