C#對圖片文件的壓縮、裁剪操作初探


在做項目時,對圖片的處理,以前都采用在上傳時,限制其大小的方式,這樣帶來諸多不便。畢竟網站運維人員不一定會對圖片做處理,經常超出大小限制,即使會使用圖片處理軟件的,也由於個人水平方面原因,處理效果差強人意。

於是采用C#為我們提供的圖像編輯功能,實現一站式上傳,通過程序生成所需大小、尺寸的目標圖片。

進入正題-->

先說圖片壓縮

第一步:需要讀取一個圖片文件,讀取方法:

// <param name="ImageFilePathAndName">圖片文件的全路徑名稱</param>
public Image ResourceImage =Image.FromFile(ImageFilePathAndName);

說明:

Image類:引用自System.Drawing,為源自 BitmapMetafile 的類提供功能的抽象基類。

主要屬性: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類:矩形,詳情請點此
以上是裁剪一個圖片文件的示例代碼。

本文所使用代碼,是項目中真實代碼,已經過測試。

希望和大家交流共同學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM