zoukankan      html  css  js  c++  java
  • C#实现对图片文件的压缩、裁剪操作实例

    本文实例讲述了C#对图片文件的压缩、裁剪操作方法,在C#项目开发中非常有实用价值。分享给大家供大家参考。具体如下:

    一般在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便。毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意。

    于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小、尺寸的目标图片。

    具体步骤如下:

    先说图片压缩:

    第一步:需要读取一个图片文件,读取方法:

    // <param name="ImageFilePathAndName">图片文件的全路径名称</param> 
    public Image ResourceImage =Image.FromFile(ImageFilePathAndName); 

    说明:

    Image类:引用自System.Drawing,为源自 Bitmap 和 Metafile 的类提供功能的抽象基类。

    主要属性:Size->获取此图像的以像素为单位的宽度和高度。

    PhysicalDimension->获取此图像的宽度和高度(如果该图像是位图,以像素为单位返回宽度和高度。如果该图像是图元文件,则以0.01 毫米为单位返回宽度和高度。)。

    PixelFormat->获取此 Image 的像素格式。

    Height、Width->获取此 Image 的高度、宽度(以像素为单位)。

    主要方法:FromFile(String)->从指定的文件创建 Image。

    FromStream(Stream)->从指定的数据流创建 Image。

    Save(String fileName)->将该 Image 保存到指定的文件或流。

    Save(Stream, ImageFormat)->将此图像以指定的格式保存到指定的流中。

    Save(String, ImageFormat)->将此 Image 以指定格式保存到指定文件。

    更多属性和方法说明请点击。

    第二步,生成缩略图,并且将原图内容按指定大小绘制到目标图片

    /// <summary> 
    /// 生成缩略图重载方法1,返回缩略图的Image对象 
    /// </summary> 
    /// <param name="Width">缩略图的宽度</param> 
    /// <param name="Height">缩略图的高度</param> 
    /// <returns>缩略图的Image对象</returns> 
    public Image GetReducedImage(int Width, int Height) 
    { 
      try
      { 
     //用指定的大小和格式初始化Bitmap类的新实例 
     Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb); 
     //从指定的Image对象创建新Graphics对象 
     Graphics graphics = Graphics.FromImage(bitmap); 
     //清除整个绘图面并以透明背景色填充 
     graphics.Clear(Color.Transparent); 
     //在指定位置并且按指定大小绘制原图片对象 
     graphics.DrawImage(ResourceImage, new Rectangle(0, 0, Width, Height)); 
     return bitmap; 
      } 
      catch (Exception e) 
      { 
     ErrMessage = e.Message; 
     return null; 
      } 
    } 

    说明:

    1、Bitmap类

    引用自System.Drawing,封装 GDI+ 位图,此位图由图形图像及其特性的像素数据组成。Bitmap 是用于处理由像素数据定义的图像的对象。

    关于封装图像的对象,详细介绍可参看官方文档:http://msdn.microsoft.com/zh-cn/library/system.drawing.bitmap.aspx

    2、Graphics类

    引用自System.Drawing,(处理图像的对象),封装一个 GDI+ 绘图图面。

    关于Graphics类可点此查看官方教程:http://msdn.microsoft.com/zh-cn/library/system.drawing.graphics.aspx

    第三步,保存

    第二步操作中返回的Image对象,暂时命名为:iImage:

    iImage.Save(pathAndName, System.Drawing.Imaging.ImageFormat.Jpeg); 

    以上是压缩操作,做了下试验,101k的图片,经过压缩后是57k。这个应该和尺寸有关系。

    以下是图片裁剪,其实原理和上面相似,无非也就是对图片进行重画操作。

    /// <summary> 
    /// 截取图片方法 
    /// </summary> 
    /// <param name="url">图片地址</param> 
    /// <param name="beginX">开始位置-X</param> 
    /// <param name="beginY">开始位置-Y</param> 
    /// <param name="getX">截取宽度</param> 
    /// <param name="getY">截取长度</param> 
    /// <param name="fileName">文件名称</param> 
    /// <param name="savePath">保存路径</param> 
    /// <param name="fileExt">后缀名</param> 
    public static string CutImage(string url, int beginX, int beginY, int getX, int getY, string fileName, string savePath, string fileExt) 
    { 
      if ((beginX < getX) && (beginY < getY)) 
      { 
     Bitmap bitmap = new Bitmap(url);//原图 
    if (((beginX + getX) <= bitmap.Width) && ((beginY + getY) <= bitmap.Height)) 
     { 
       Bitmap destBitmap = new Bitmap(getX, getY);//目标图 
       Rectangle destRect = new Rectangle(0, 0, getX, getY);//矩形容器 
       Rectangle srcRect = new Rectangle(beginX, beginY, getX, getY); 
     
       Graphics.FromImage(destBitmap); 
                Graphics.DrawImage(bitmap, destRect, srcRect, GraphicsUnit.Pixel); 
         
       ImageFormat format = ImageFormat.Png; 
       switch (fileExt.ToLower()) 
       { 
     case "png": 
       format = ImageFormat.Png; 
       break; 
     case "bmp": 
       format = ImageFormat.Bmp; 
       break; 
     case "gif": 
       format = ImageFormat.Gif; 
       break; 
       } 
       destBitmap.Save(savePath + "//" + fileName , format); 
       return savePath + "\" + "*" + fileName.Split('.')[0] + "." + fileExt; 
     } 
     else
     { 
       return "截取范围超出图片范围"; 
     } 
      } 
      else
      { 
     return "请确认(beginX < getX)&&(beginY < getY)"; 
      } 
    } 

    说明:

    Rectangle类:矩形,详情可参考官方文档:http://msdn.microsoft.com/zh-cn/library/system.windows.shapes.rectangle(v=vs.85).aspx

    以上就是裁剪一个图片文件的示例代码。

    以上动图由“图斗罗”提供

  • 相关阅读:
    mysql 忘记密码
    IE Webcontrols Treeview的一个bug及修正
    [原创]关于打开新窗口和关闭老窗口的2个方法!
    如何传值在2个页面之间 :要求不刷新父页面,并且不能用Querystring传值
    怎样才能用一个adsl帐号使两台机子同时上网?
    如何查找 文件的MIME类型
    [原创]利用DropDownlist来控制Textbox输入数字的精度
    动态添加Html单元格时,事件怎么写?如mouseover事件
    [原创]通过点击节点或选择节点前checkbox实现树节点单选功能!
    [原创]如何控制TreeView在打开的时候只展开两层?
  • 原文地址:https://www.cnblogs.com/ldyblogs/p/image.html
Copyright © 2011-2022 走看看