1. 程式人生 > >C#生成縮圖不失真的方法

C#生成縮圖不失真的方法

最近一個手持機專案有個需求,因為物料圖片的大小不一,有的很大顯示到手持機上會只顯示圖片的一部分,介面顯得非常亂,很影響客戶的體驗度。所以需要一個方法,將上傳到伺服器上的圖片進行處理,按照一定的大小格式進行儲存。

下面提供了兩種獲取圖片縮圖的方法,供大家參考。

方法一:通過呼叫Image物件的自帶方法GetThumbnailImage()進行圖片轉換

        /// <summary>
        /// 生成縮圖過載方法,返回縮圖的Image物件
        /// </summary>
        /// <param name="width">縮圖的寬度</param>
/// <param name="height">縮圖的高度</param> /// <param name="imageFrom">原Image物件</param> /// <returns>縮圖的Image物件</returns> public Image GetReducedImage2(int width, int height, Image imageFrom) { // 源圖寬度及高度 int imageFromWidth = imageFrom.Width; int
imageFromHeight = imageFrom.Height; try { // 生成的縮圖實際寬度及高度.如果指定的高和寬比原圖大,則返回原圖;否則按照指定高寬生成圖片 if (width >= imageFromWidth && height >= imageFromHeight) { return imageFrom; } else
{ Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(() => { return false; }); //呼叫Image物件自帶的GetThumbnailImage()進行圖片縮略 Image reducedImage = imageFrom.GetThumbnailImage(width, height, callb, IntPtr.Zero); //將圖片以指定的格式儲存到到指定的位置 reducedImage.Save(@"E:\640x480.png", ImageFormat.Png); return reducedImage; } } catch (Exception) { //丟擲異常 throw new Exception("轉換失敗,請重試!"); } }

方法二:採用雙三次插值法,執行預篩選以確保高質量的收縮,此模式可產生質量教高的轉換影象。

        /// <summary>
        /// 按照指定的高和寬生成相應的規格的圖片,採用此方法生成的縮圖片不會失真
        /// </summary>
        /// <param name="width">指定寬度</param>
        /// <param name="height">指定高度</param>
        /// <param name="imageFrom">原圖片</param>
        /// <returns>返回新生成的圖</returns>
        public static Image GetReducedImage(int width, int height, Image imageFrom)
        {
            // 源圖寬度及高度 
            int imageFromWidth = imageFrom.Width;
            int imageFromHeight = imageFrom.Height;

            // 生成的縮圖實際寬度及高度.如果指定的高和寬比原圖大,則返回原圖;否則按照指定高寬生成圖片
            if (width >= imageFromWidth && height >= imageFromHeight)
            {
                return imageFrom;
            }
            else
            {
                // 生成的縮圖在上述"畫布"上的位置
                int X = 0;
                int Y = 0;

                // 建立畫布
                Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
                bmp.SetResolution(imageFrom.HorizontalResolution, imageFrom.VerticalResolution);
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    // 用白色清空 
                    g.Clear(Color.White);

                    // 指定高質量的雙三次插值法。執行預篩選以確保高質量的收縮。此模式可產生質量最高的轉換影象。 
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

                    // 指定高質量、低速度呈現。 
                    g.SmoothingMode = SmoothingMode.HighQuality;

                    // 在指定位置並且按指定大小繪製指定的 Image 的指定部分。 
                    g.DrawImage(imageFrom, new Rectangle(X, Y, width, height),
                        new Rectangle(0, 0, imageFromWidth, imageFromHeight), GraphicsUnit.Pixel);

                    //將圖片以指定的格式儲存到到指定的位置
                    bmp.Save(@"E:\640x480.png", ImageFormat.Png);
                    return bmp;
                }
            }
        }

先分享這兩種方法,大家可以嘗試。