C#獲取高清縮略圖

談到獲取縮略圖,C#的Image類提供了一個GetThumbnailImage的方法獲取,但是我試了一下~得到的縮略圖相當模糊~

那怎麼獲取高清的呢?查了MSDN,拼命死鎖後得到這樣一個啓示:縮略圖不就是原圖按比例縮小,那我們將原圖讀入按比例縮放後再在畫布上重繪一個不就可以了麼?

OK~思路有了~那我們就試試~

下面先貼出Image.GetThumbnailImage的方法:

 

        /// <summary>
        /// 獲取源圖像的縮略圖
        /// </summary>
        /// <param name="Percent">設置原圖的縮略比</param>
        /// <param name="OriginFilePath">原圖的路徑</param>
        /// <param name="TargetFilePath">要保存的縮略圖的路徑</param>
        /// <returns>表明此次操作是否成功</returns>
        private bool GetMicroImage(double Percent,string OriginFilePath, string TargetFilePath)
        {
            try
            {
                Bitmap bt = new Bitmap(120,120);  //創建Bitmap實例
                Graphics g = Graphics.FromImage(bt);  //創建Graphics實例
                g.Clear(Color.White);   //設置畫布背景顏色爲白色
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                Image OrginImage = Image.FromFile(OriginFilePath);  //獲取源圖像的Image實例
                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);  //定義委託
                int ImageWidth = Convert.ToInt32(OrginImage.Width * Percent);  //設置高度
                int ImageHeight = Convert.ToInt32(OrginImage.Height * Percent);  //設置寬度

                Image MicroImage = OrginImage.GetThumbnailImage(ImageWidth, ImageWidth, callb, IntPtr.Zero);  //獲取源圖像的縮略圖
                if (ImageWidth > ImageHeight)  //如果原圖寬度大於高度
                {
                    g.DrawImage(MicroImage, 0, (int)(120 - ImageHeight) / 2, ImageWidth, ImageHeight);  //縮放圖片
                }
                else
                {
                    g.DrawImage(MicroImage, (int)(120 - ImageWidth) / 2, 0, ImageWidth, ImageHeight);
                }
                g.DrawRectangle(new Pen(Color.Gray), 0, 0, 119, 119);  //繪製縮略圖的邊框
                bt.Save(TargetFilePath + @"/" + this.OriginFileName.ToString() + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);  //保存縮略圖
                this.OriginFileName++;
                bt.Dispose();  //釋放對象
                MicroImage.Dispose();
                OrginImage.Dispose();

                return true;
            }
            catch(Exception e)
            {
                MessageBox.Show("錯誤信息:" + e.Message, "系統提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }


然後貼出我寫的:

 

        /// <summary>
        /// 高質量縮放圖片
        /// </summary>
        /// <param name="OriginFilePath">源圖的路徑</param>
        /// <param name="TargetFilePath">存儲縮略圖的路徑</param>
        /// <param name="DestWidth">縮放後圖片寬度</param>
        /// <param name="DestHeight">縮放後圖片高度</param>
        /// <returns>表明此次操作是否成功</returns>
        private bool GetMicroImage(string OriginFilePath, string TargetFilePath,int DestWidth,int DestHeight)
        {
            Image OriginImage = Image.FromFile(OriginFilePath);
            System.Drawing.Imaging.ImageFormat thisFormat = OriginImage.RawFormat;
            //按比例縮放
            int sW = 0, sH = 0;
            int ImageWidth = OriginImage.Width;
            int ImageHeight = OriginImage.Height;

            if (ImageWidth > DestWidth || ImageHeight > DestHeight)
            {
                if ((ImageWidth * DestWidth) > (ImageHeight * DestHeight))
                {
                    sW = DestWidth;
                    sH = (DestHeight * ImageHeight) / ImageWidth;
                }
                else
                {
                    sH = DestHeight;
                    sW = (DestWidth * ImageWidth) / ImageHeight;
                }
            }
            else
            {
                sW = ImageWidth;
                sH = ImageHeight;
            }

            Bitmap bt = new Bitmap(DestWidth,DestHeight); //根據指定大小創建Bitmap實例
            using(Graphics g = Graphics.FromImage(bt))
            {
                g.Clear(Color.White);
                //設置畫布的描繪質量
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.DrawImage(OriginImage,new Rectangle((DestWidth - sW) / 2,(DestHeight - sH) / 2,sW,sH));
                g.Dispose();
            }

            System.Drawing.Imaging.EncoderParameters EncoderParams = new System.Drawing.Imaging.EncoderParameters(); //取得內置的編碼器
            long[] Quality = new long[1];
            Quality[0] = 100;
            System.Drawing.Imaging.EncoderParameter EncoderParam = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality,Quality);
            EncoderParams.Param[0] = EncoderParam;

            try
            {
                //獲得包含有關內置圖像編碼解碼器的信息的ImageCodecInfo 對象
                System.Drawing.Imaging.ImageCodecInfo[] arrayICI = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
                System.Drawing.Imaging.ImageCodecInfo jpegICI = null;
                for (int i = 0; i < arrayICI.Length; i++)
                {
                    if (arrayICI[i].FormatDescription.Equals("JPEG"))
                    {
                        jpegICI = arrayICI[i]; //設置爲JPEG編碼方式
                        break;
                    }
                }

                if (jpegICI != null) //保存縮略圖
                {
                    bt.Save(TargetFilePath + @"/" + this.OriginFileName.ToString() + ".jpg", jpegICI, EncoderParams);
                }
                else
                {
                    bt.Save(TargetFilePath + @"/" + this.OriginFileName.ToString() + ".jpg", thisFormat);
                }
                this.OriginFileName++;
                OriginImage.Dispose();
                return true;
            }
            catch (System.Runtime.InteropServices.ExternalException e1)  //GDI+發生一般錯誤
            {
                MessageBox.Show("錯誤信息:" + e1.Message, "系統提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            catch (Exception e2)
            {
                MessageBox.Show("錯誤信息:" + e2.Message, "系統提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }


 

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