C# 圖片處理生成縮略圖

縮略圖通常是將圖片內容進行一定的縮小展現,或裁剪展現,主要有兩個目的,一是提供一定的預覽功能,二是節省屏幕展示空間、節省流量。
在網站中我們通常運用在商品的列表,比如商城、圖書、新聞等等列表的圖片。在C#中我們如何生成縮略圖呢,也就是縮小圖片,下面我們來看一看如何縮小圖片。

其中方法參數如下:
originalImagePath:源圖路徑(物理路徑)
thumbnailPath:縮略圖路徑(物理路徑)
width:生成縮略圖寬度
height:生成縮略圖高度
mode:生成縮略圖的模式


        public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, ThumbnailMode mode)
        {
            System.Drawing.Image img_OriginalImage = null;
            ImageFormat tFormat = null;
            try
            {
                img_OriginalImage = (Bitmap)System.Drawing.Image.FromFile(originalImagePath);
                tFormat = img_OriginalImage.RawFormat;
            }
            catch (Exception ex)
            {
                if (img_OriginalImage != null)
                {
                    img_OriginalImage.Dispose();
                }
                Const.iErrorCount++;
                
                throw new Exception("壓縮圖片:" + originalImagePath + "失敗!\r\n" + ex.Message);

            }

            int i_ToWidth = width;
            int i_ToHeight = height;

            int x = 0;
            int y = 0;

            int i_OriginalWidth = img_OriginalImage.Width;
            int i_OriginalHeight = img_OriginalImage.Height;

            switch (mode)
            {
                case ThumbnailMode.Width:
                    i_ToHeight = img_OriginalImage.Height * width / img_OriginalImage.Width;
                    break;
                case ThumbnailMode.Height:
                    i_ToWidth = img_OriginalImage.Width * height / img_OriginalImage.Height;
                    break;
                case ThumbnailMode.Cut:
                    if ((double)img_OriginalImage.Width / (double)img_OriginalImage.Height > (double)i_ToWidth / (double)i_ToHeight)
                    {
                        i_OriginalHeight = img_OriginalImage.Height;
                        i_OriginalWidth = img_OriginalImage.Height * i_ToWidth / i_ToHeight;
                        y = 0;
                        x = (img_OriginalImage.Width - i_OriginalWidth) / 2;
                    }
                    else
                    {
                        i_OriginalWidth = img_OriginalImage.Width;
                        i_OriginalHeight = img_OriginalImage.Width * height / i_ToWidth;
                        x = 0;
                        y = (img_OriginalImage.Height - i_OriginalHeight) / 2;
                    }
                    break;
                default:
                    break;
            }


            //新建一個BMP圖片
            System.Drawing.Image img_BitMap = new System.Drawing.Bitmap(i_ToWidth, i_ToHeight);
            //新建一個畫板
            System.Drawing.Graphics gp = Graphics.FromImage(img_BitMap);
            //設置高質量插值法
            gp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            //設置高質量、低速度呈現平滑程度
            gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gp.CompositingQuality = CompositingQuality.HighQuality;

            //清空畫布並以透明背景色填充
            gp.Clear(Color.Transparent);
            //指定位置並按大小繪製原圖片的指定部分
            gp.DrawImage(img_OriginalImage, new Rectangle(0, 0, i_ToWidth, i_ToHeight), new Rectangle(x, y, i_OriginalWidth, i_OriginalHeight), GraphicsUnit.Pixel);

            try
            {
                EncoderParameters ep = new EncoderParameters();
                long[] qy = new long[1];
                qy[0] = 100;//設置壓縮的比例1-100  
                EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
                ep.Param[0] = eParam;

                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo jpegICIinfo = null;
                for (int i = 0; i < arrayICI.Length; i++)
                {
                    if (arrayICI[i].FormatDescription.Equals("JPEG"))
                    {
                        jpegICIinfo = arrayICI[i];
                        break;
                    }
                }
                if (jpegICIinfo != null && Equals(tFormat, ImageFormat.Jpeg))
                {
                    //以JPG格式保存圖片
                    img_BitMap.Save(thumbnailPath, jpegICIinfo, ep);
                    //Const.iSuccessCount++;
                }
                else
                {
                    img_BitMap.Save(thumbnailPath, tFormat);
                    //Const.iSuccessCount++;
                }
            }
            catch (Exception ex)
            {
                LogManager.WriteLog("複製圖片:" + originalImagePath + "失敗!\r\n" + ex.Message + ex.StackTrace);
                Const.iErrorCount++;
                throw;
            }
            finally
            {
                if (img_OriginalImage != null)
                {
                    img_OriginalImage.Dispose();
                }
                if (img_BitMap != null)
                {
                    img_BitMap.Dispose();
                }
                if (gp != null)
                {
                    gp.Dispose();
                }
                //GC.Collect();
            }
        }
  • 在該方法中我們首先使用(Bitmap)System.Drawing.Image.FromFile將文件加載到bitmap。
  • 根據mode傳入的壓縮模式進行原始繪圖區域的計算。
  • 將計算出的區域繪製到新的BitMap。
  • 將繪製的BitMap圖片保存到指定文件。

通過如上的幾步就完成了縮略圖的生成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章