• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#裁剪,缩放,清晰度,水印处理操作示例

C#裁剪,缩放,清晰度,水印处理操作示例

作者:吴 剑 字体:[增加 减小] 来源:互联网 时间:2017-05-28

吴 剑 通过本文主要向大家介绍了c#示例,c#代码示例,c#程序示例,水印示例,c#图片加水印等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言

需求源自项目中的一些应用,比如相册功能,通常用户上传相片后我们都会针对该相片再生成一张缩略图,用于其它页面上的列表显示。随便看一下,大部分网站基本都是将原图等比缩放来生成缩略图。但完美主义者会发现一些问题,比如显示排版时想让相片缩略图列表非常统一、整齐、和美观,比如要求每张缩略图大小固定为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)

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

图片水印

仅演示了效果,如需要变更字体、水印透明度、位置等可自行在代码或方法中扩展。

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>
 /// 图片处理
 /// http://www.cnblogs.com/wu-jian/
 /// 
 /// 吴剑 2011-02-20 创建
 /// 吴剑 2012-08-08 修改
 /// </summary>
 public class Image
 {
  #region 正方型裁剪并缩放

  /// <summary>
  /// 正方型裁剪
  /// 以图片中心为轴心,截取正方型,然后等比缩放
  /// 用于头像处理
  /// </summary>
  /// <remarks>吴剑 2012-08-08</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>吴剑 2012-08-08</remarks>
  /// <param name="fromFile">原图Stream对象</param>
  /// <param 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • c#中合并excel表格的方法示例
  • C#裁剪,缩放,清晰度,水印处理操作示例
  • C#获取HTML文本的第一张图片与截取内容摘要示例代码
  • C#实现创建桌面快捷方式与添加网页到收藏夹的示例
  • C#实现的微信网页授权操作逻辑封装示例
  • C#代码实现短信验证码接口示例
  • C#信号量用法简单示例
  • C#实现冒泡排序算法的代码示例
  • C#微信公众号与订阅号接口开发示例代码
  • C#中使用基数排序算法对字符串进行排序的示例

相关文章

  • 2017-05-28c++与c#的时间转换示例分享
  • 2017-05-28.NET(C#):Emit创建异常处理的方法
  • 2017-05-28C#实现读取注册表监控当前操作系统已安装软件变化的方法
  • 2017-05-28C#.NET实现网页自动登录的方法
  • 2017-05-28c# 值类型实例构造器
  • 2017-05-28C#读取csv格式文件的方法
  • 2017-05-28c#数学表示法(后缀表示法)详解
  • 2017-05-28WinForm实现最小化到系统托盘方法实例详解
  • 2017-05-28c#中实现图片灰度化技术详解
  • 2017-05-28C#中数组初始化与数组元素复制的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#调用VB进行简繁转换的方法
    • C#自动生成漂亮的水晶效果头像的实现代码
    • C#实现屏幕拷贝的方法
    • C#中winform实现自动触发鼠标、键盘事件的方法
    • C#实现路由器断开连接,更改公网ip的实例代码
    • 游戏开发之随机概率的选择算法
    • C#实现计算一个点围绕另一个点旋转指定弧度后坐标值的方法
    • C#实现向多线程传参的三种方式实例分析
    • C#中WebBroeser控件用法实例教程
    • 那些年,我还在学习C# 学习笔记续

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有