[收藏]ASP.NET產生高品質縮圖通用函數(VB.NET、c#代碼)
來源:互聯網
上載者:User
導讀:
網站開發時,產生縮圖是一個非常常見和實用的功能.以前在asp裡只能藉助com組件實現,現在在.net裡可以利用架構的強大的類庫輕鬆實現.下面帖出完整的代碼(帶詳細注釋),參考了網上的一些文章及.net sdk相關內容,俺整理了C#和VB.NET兩種代碼。
先看下面這一段代碼:
'將圖片縮小後儲存
Private Sub SaveSmallPic(ByVal sFileName As String)
Dim image As System.Drawing.Image, newimage As System.Drawing.Image
Dim callb As System.Drawing.Image.GetThumbnailImageAbort
image = System.Drawing.Image.FromStream(Me.File1.PostedFile.InputStream)
If image.Width < image.Height Then
newimage = image.GetThumbnailImage(480, 640, callb, New System.IntPtr(0))
Else
newimage = image.GetThumbnailImage(640, 480, callb, New System.IntPtr(0))
End If
image.Dispose()
'將新圖片及圖片變小後存到臨時路徑中
newimage.Save(sFileName, System.Drawing.Imaging.ImageFormat.Jpeg)
newimage.Dispose()
End Sub
再看以下產生高品質縮圖代碼(VB和C#)
VB.NE代碼:
'' '' 產生縮圖
''
'' 源圖路徑(實體路徑)
'' 縮圖路徑(實體路徑)
'' 縮圖寬度
'' 縮圖高度
'' 產生縮圖的方式
''
Public Shared Sub MakeThumbnail(ByVal originalImagePath As String, ByVal thumbnailPath As String, ByVal width As Integer, ByVal height As Integer, ByVal mode As String)
Dim originalImage As System.Drawing.Image = System.Drawing.Image.FromFile(originalImagePath)
Dim towidth As Integer = width
Dim toheight As Integer = height
Dim x As Integer = 0
Dim y As Integer = 0
Dim ow As Integer = originalImage.Width
Dim oh As Integer = originalImage.Height
Select Case mode
Case "HW" '指定高寬縮放(可能變形)
Case "W" '指定寬,高按比例
toheight = originalImage.Height * width / originalImage.Width
Case "H" '指定高,寬按比例
towidth = originalImage.Width * height / originalImage.Height
Case "Cut" '指定高寬裁減(不變形)
If System.Convert.ToDouble(originalImage.Width) / System.Convert.ToDouble(originalImage.Height) > System.Convert.ToDouble(towidth) / System.Convert.ToDouble(toheight) Then
oh = originalImage.Height
ow = originalImage.Height * towidth / toheight
y = 0
x = (originalImage.Width - ow) / 2
Else
ow = originalImage.Width
oh = originalImage.Width * height / towidth
x = 0
y = (originalImage.Height - oh) / 2
End If
Case Else
End Select
'建立一個bmp圖片
Dim bitmap = New Drawing.Bitmap(towidth, toheight)
'建立一個畫板
Dim g As Drawing.Graphics = Drawing.Graphics.FromImage(bitmap)
'設定高品質插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High
'設定高品質,低速度呈現平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
'清空畫布並以透明背景色填充
g.Clear(Drawing.Color.Transparent)
'在指定位置並且按指定大小繪製原圖片的指定部分
g.DrawImage(originalImage, New Drawing.Rectangle(0, 0, towidth, toheight), New Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel)
Try
'以jpg格式儲存縮圖
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg)
Catch e As Exception
Throw e
Finally
originalImage.Dispose()
bitmap.Dispose()
g.Dispose()
End Try
End Sub
C#代碼:
////
/// 產生縮圖
///
/// 源圖路徑(實體路徑)
/// 縮圖路徑(實體路徑)
/// 縮圖寬度
/// 縮圖高度
/// 產生縮圖的方式
public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
{
Image originalImage = Image.FromFile(originalImagePath);
int towidth = width;
int toheight = height;
int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;
switch (mode)
{
case "HW": //指定高寬縮放(可能變形)
break;
case "W": //指定寬,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H": //指定高,寬按比例
towidth = originalImage.Width * height / originalImage.Height;
break;
case "Cut": //指定高寬裁減(不變形)
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
default:
break;
}
//建立一個bmp圖片
Image bitmap = new Bitmap(towidth, toheight);
//建立一個畫板
Graphics g = Graphics.FromImage(bitmap);
//設定高品質插值法
g.InterpolationMode = InterpolationMode.High;
//設定高品質,低速度呈現平滑程度
g.SmoothingMode = SmoothingMode.HighQuality;
//清空畫布並以透明背景色填充
g.Clear(Color.Transparent);
//在指定位置並且按指定大小繪製原圖片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel);
try
{
//以jpg格式儲存縮圖
bitmap.Save(thumbnailPath, ImageFormat.Jpeg);
}
catch (Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
很明顯示,第一段代碼產生出來的縮圖品質非常差,而下面的代碼產生出來的縮圖比較清晰,大家試試吧。
本文轉自
http://www.zhouguoqing.com.cn/zBlog/post/30.html