C#生成縮圖不失真的方法
阿新 • • 發佈:2019-01-03
最近一個手持機專案有個需求,因為物料圖片的大小不一,有的很大顯示到手持機上會只顯示圖片的一部分,介面顯得非常亂,很影響客戶的體驗度。所以需要一個方法,將上傳到伺服器上的圖片進行處理,按照一定的大小格式進行儲存。
下面提供了兩種獲取圖片縮圖的方法,供大家參考。
方法一:通過呼叫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;
}
}
}
先分享這兩種方法,大家可以嘗試。