zoukankan      html  css  js  c++  java
  • 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 是用于处理由像素数据定义的图像的对象。

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

    2、Graphics类

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

    详情请点此

    第三步,保存

           第二步操作中返回的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类:矩形,详情请点此
    以上是裁剪一个图片文件的示例代码。

  • 相关阅读:
    UVA 254 Towers of Hanoi
    UVA 701 The Archeologists' Dilemma
    UVA 185 Roman Numerals
    UVA 10994 Simple Addition
    UVA 10570 Meeting with Aliens
    UVA 306 Cipher
    UVA 10160 Servicing Stations
    UVA 317 Hexagon
    UVA 10123 No Tipping
    UVA 696 How Many Knights
  • 原文地址:https://www.cnblogs.com/endv/p/6170576.html
Copyright © 2011-2022 走看看