导读:
网站开发时,生成缩略图是一个非常常见和实用的功能.以前在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
网站开发时,生成缩略图是一个非常常见和实用的功能.以前在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