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

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

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

    进入正题-->

    先说图片压缩

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

    1. // <param name="ImageFilePathAndName">图片文件的全路径名称</param>  
    2. 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 以指定格式保存到指定文件。

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

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

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

    说明: 1、Bitmap类

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

    (封装图像的对象),详细介绍请点此

    2、Graphics类

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

    详情请点此

    第三步,保存

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

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

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

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

    1. /// <summary>  
    2.         /// 截取图片方法  
    3.         /// </summary>  
    4.         /// <param name="url">图片地址</param>  
    5.         /// <param name="beginX">开始位置-X</param>  
    6.         /// <param name="beginY">开始位置-Y</param>  
    7.         /// <param name="getX">截取宽度</param>  
    8.         /// <param name="getY">截取长度</param>  
    9.         /// <param name="fileName">文件名称</param>  
    10.         /// <param name="savePath">保存路径</param>  
    11.         /// <param name="fileExt">后缀名</param>  
    12.         public static string CutImage(string url, int beginX, int beginY, int getX, int getY, string fileName, string savePath, string fileExt)  
    13.         {  
    14.             if ((beginX < getX) && (beginY < getY))  
    15.             {  
    16.                 Bitmap bitmap = new Bitmap(url);//原图  
    17. if (((beginX + getX) <= bitmap.Width) && ((beginY + getY) <= bitmap.Height))  
    18.                 {  
    19.                     Bitmap destBitmap = new Bitmap(getX, getY);//目标图  
    20.                     Rectangle destRect = new Rectangle(0, 0, getX, getY);//矩形容器  
    21.                     Rectangle srcRect = new Rectangle(beginX, beginY, getX, getY);  
    22.   
    23.                     Graphics.FromImage(destBitmap);  
    24.             Graphics.DrawImage(bitmap, destRect, srcRect, GraphicsUnit.Pixel);  
    25.                       
    26.                     ImageFormat format = ImageFormat.Png;  
    27.                     switch (fileExt.ToLower())  
    28.                     {  
    29.                         case "png":  
    30.                             format = ImageFormat.Png;  
    31.                             break;  
    32.                         case "bmp":  
    33.                             format = ImageFormat.Bmp;  
    34.                             break;  
    35.                         case "gif":  
    36.                             format = ImageFormat.Gif;  
    37.                             break;  
    38.                     }  
    39.                     destBitmap.Save(savePath + "//" + fileName , format);  
    40.                     return savePath + "\" + "*" + fileName.Split('.')[0] + "." + fileExt;  
    41.                 }  
    42.                 else  
    43.                 {  
    44.                     return "截取范围超出图片范围";  
    45.                 }  
    46.             }  
    47.             else  
    48.             {  
    49.                 return "请确认(beginX < getX)&&(beginY < getY)";  
    50.             }  
    51.         }  

    说明:
    Rectangle类:矩形,详情请点此
    以上是裁剪一个图片文件的示例代码。

    本文所使用代码,是项目中真实代码,已经过测试。

    希望和大家交流共同学习。

    原文地址http://www.cnblogs.com/xyang/archive/2013/02/25/2932145.html

  • 相关阅读:
    HNOI2018退役记
    codeforces 960G Bandit Blues
    codeforces 933D A Creative Cutout
    tyvj1953 Normal
    loj6119 「2017 山东二轮集训 Day7」国王
    codeforces 293E Close Vertices
    bzoj1808 [Ioi2007]training 训练路径
    bzoj2219 数论之神
    bzoj4361 isn
    loj2064[HAOI2016]找相同字符
  • 原文地址:https://www.cnblogs.com/rr163/p/3985923.html
Copyright © 2011-2022 走看看