談到獲取縮略圖,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;
}
}