[收藏]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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.