- 浏览: 2103280 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
C#图片处理基本应用(裁剪,缩放,清晰度,水印)
前言
需求源自项目中的一些应用,比如相册功能,通常用户上传相片后我们都会针对该相片再生成一张缩略图,用于其它页面上的列表显示。随便看一下,大部分网站基本都是将原图等比缩放来生成缩略图。但完美主义者会发现一些问题,比如显示排版时想让相片缩略图列表非常统一、整齐、和美观,比如要求每张缩略图大小固定为120 x 90且不拉伸变形怎么办?再比如用户头像如何让缩略图比原图更清晰?或是如何在上传的图片下加一个半透明的LOGO水印?
OK,本文根据自己的项目代码描述以上问题的解决方案,全部基于.Net Framework类库完成,代码中包含了C#图片处理的一些基础知识,与大家分享,个人能力有限,不足之处还请及时指正。
提高缩略图清晰度
(原图200*200,12.3k)(处理后80*80,17.7k)
之前一直认为缩略图不可能比原图清晰,直到某天一位产品的同事给我看某网站的效果。于是开始寻找.NET下实现代码,仔细观察缩略图确实比原图更清晰了一些,但代价是缩略图文件比原图更大,所以如果你想让一张占满显示器屏幕的超大图片更清晰,那么图片占用空间和网络流量就必需考虑了,如果是互联网应用,建议缩略图在200像素以内的使用该方法。当然如果哪位有更好的代码即能让图片文件大小变化不大又让图片更清晰还请分享。
图片裁剪
(原图256*192)(裁剪要求100*100)
(原图256*192)(裁剪要求90*120)
(原图256*192)(裁剪要求120*90)
(原图146*256)(裁剪要求100*100)(原图146*256)(裁剪要求90*120)
(原图146*256)(裁剪要求120*90)
算法:以原图中心作为裁剪中心,最大范围的对原图进行裁剪,然后对裁剪结果等比缩放。
图片水印
仅演示了效果,如需要变更字体、水印透明度、位置等可自行在代码或方法中扩展。
代码
封装了几个通用的方法,如发现有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
|
{ |
/// <summary>
|
/// 图片处理类
|
/// 吴剑 2008-07-02 创建
|
/// 吴剑 2011-01-21 修改
|
/// </summary>
|
public class PTImage
|
{
|
#region 正方型裁剪并缩放
|
/// <summary>
|
/// 正方型裁剪
|
/// 以图片中心为轴心,截取正方型,然后等比缩放
|
/// 用于头像处理
|
/// </summary>
|
/// <remarks>吴剑 2010-11-23</remarks>
|
/// <param name="postedFile">原图HttpPostedFile对象</param>
|
/// <param name="fileSaveUrl">缩略图存放地址</param>
|
/// <param name="side">指定的边长(正方型)</param>
|
/// <param name="quality">质量(范围0-100)</param>
|
public static void CutForSquare(System.Web.HttpPostedFile postedFile, 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(postedFile.InputStream, 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();
|
}
|
}
|
|
/// <summary>
|
/// 正方型裁剪
|
/// 以图片中心为轴心,截取正方型,然后等比缩放
|
/// 用于头像处理
|
/// </summary>
|
/// <remarks>吴剑 2010-11-23</remarks>
|
/// <param name="postedFile">原图HttpPostedFile对象</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);
|
|
相关推荐
C#图片处理高级应用(裁剪,缩放,清晰度,水印)
c# 处理图片源码 缩放 裁剪 等c# 处理图片源码 缩放 裁剪 等c# 处理图片源码 缩放 裁剪 等c# 处理图片源码 缩放 裁剪 等
C# 图片工具类 上传 缩放 裁剪 水印 生成缩略图
关于“图片保存、缩放、裁剪、合成”的示例,应用于c#,VS2008
主要为大家详细介绍了C#裁剪,缩放,清晰度,水印处理操作示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
C#图片缩放,使用Bitmap的方式,可以将图片按比例缩放,也可以设定固定大小
代码实现了扫描文件夹下面的图片,将指定大小的图片进行裁剪,缩放,并覆盖原图片。
c#图片处理,含图片缩放、边框等。刚学C#不久写的,后来没怎么改,若有其他需求自行修改
像Photoshop一样裁剪图片,鼠标拖动裁剪, 可在进行缩放或者没有缩放的图片上进行原图按比例裁剪,操作或PS一样,按住鼠标左键拖动。 内含有纠偏算法,亮度调整,对比度调整算法。
C# 给图片加上文字或图片水印,通过使用GDI+ 给图片上加水印。实现了透明文字与透明图片水印。可设置水印位置。
c#图片裁剪效果c#图片裁剪效果c#图片裁剪效果c#图片裁剪效果
C#图片剪裁例子_ C#裁剪图片的特殊区域例子
主要介绍了C#实现缩放和剪裁图片的方法,结合实例形式分析了C#针对图片属性的缩放、裁剪等相关操作技巧,需要的朋友可以参考下
使用Graphics和LockBits锁内存方式进行图片水印的添加和去掉操作
图片处理、二维码识别生成工具c#支持图片裁剪、任意缩放 支持二维码识别和生成.zip
C#图片处理 图片帮助类 C#缩略图 C#图片水印 效果完美。
C# Asp.net编写实现图片缩放及裁剪例题,头像裁剪例题。可以浏览图片后进行裁剪,裁剪时可以根据操作移动位置和区域,且可以缩放大小等进行裁剪操作。 自己编写了一段时间,供大家分享交流学习。
Csharp处理图片拖动和缩放功能,Csharp处理图片拖动和缩放功能