• 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#图片处理3种高级应用

C#图片处理3种高级应用

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

吴剑 通过本文主要向大家介绍了c站,c语言,欲情 c max,奔驰c200,85度c等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

利用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>吴剑 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 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, max



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

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

  • C# 检索不区分大小写并高亮显示实例详解
  • C#实现Base64处理的加密解密,编码解码示例
  • C# SqlHelper应用开发学习
  • C#多线程经典示例(吃苹果)
  • C#使用Windows Service的简单教程(创建、安装、卸载、调试)
  • C# 6.0 的知识梳理
  • C#向PPT文档插入图片以及导出图片的实例
  • C#使用Jquery zTree实现树状结构显示 异步数据加载
  • C#清理非托管对象实例分析
  • C#双缓冲技术实例详解

相关文章

  • 2017-05-28xml 中的冒号 读取问题的解决
  • 2017-05-28WPF设置窗体可以使用鼠标拖动大小的方法
  • 2017-05-28C#语法相比其它语言比较独特的地方(三)
  • 2017-05-28C# ComboBox的联动操作(三层架构)
  • 2017-05-28C#实现获取枚举中元素个数的方法
  • 2017-05-28深入浅出23种设计模式
  • 2017-05-28C#使用SqlBulkCopy批量复制数据到数据表
  • 2017-05-28c#求点到直线的投影点坐标
  • 2017-05-28C#利用反射来判断对象是否包含某个属性的实现方法
  • 2017-05-28深入理解StringBuilder的使用方法

文章分类

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

最近更新的内容

    • 使用C#给PDF文档添加注释的实现代码
    • C# 排序算法之堆排序
    • WinForm中BackgroundWorker控件用法简单实例
    • C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析
    • c# 调用Surfer软件,添加引用的具体操作方法
    • C#实现根据给出的相对地址获取网站绝对地址的方法
    • 使用checked语句防止数据溢出的解决方法
    • 详解C#用new和override来实现抽象类的重写区别
    • C#判断字符编码的方法总结(六种方法)
    • C# Socket粘包处理讲解示例

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

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