碰ASP.NET一段時間了
前陣子最讓我頭痛的是縮圖吧
大家都知道如果使用Ggoole出來的.NET一般縮圖法
縮圖能力實在是爆爛,JPG就不算好了,gif或是Png其他格式更是慘不忍睹
一般的縮圖都是使用GetThumbnailImage方法
不過插補法的品質實在讓人不敢恭維
比較早期的還得縮兩次才能獲得勉強OK的品質(一樣只限於JPG)
於是翻遍外國高手的網站
終於在某老外的技術文章內找到比較OK的作法了!
縮出來的品質也算不賴
當然我還是習慣改寫成一個共用的Function啦
我習慣回傳到MemoryStream裡面,這樣要應用在資料庫還是file都沒問題
當然這個Function還是有所限制,回傳會變成正方形的圖
如果是長方形的圖,則會被我以長邊為準,然後硬縮到正方形裡面,多出來的兩邊,我設白底
因為是商業應用的網站,會要求廠商盡量給白底的商品圖囉
另外,不論傳入哪種圖片,硬改成JPG格式會取得比較好的品質喔
目前還沒找到更OK的做法
有需要的朋友視情況修改吧,有些類別我已經import過了,請自己加上去吧
Public Shared Function imgThumbnail(ByVal original_image As Image, ByVal size As Integer) As MemoryStream
Dim ms As MemoryStream = New MemoryStream()
Dim final_image As Bitmap = Nothing
Dim graphic As Graphics = Nothing
Try
Dim width As Integer = original_image.Width
Dim height As Integer = original_image.Height
Dim target_width As Integer = size
Dim target_height As Integer = size
Dim new_width, new_height As Integer
Dim target_ratio As Double = target_width / target_height
Dim image_ratio As Double = width / height
If target_ratio > image_ratio Then
new_height = target_height
new_width = Math.Floor(image_ratio * target_height)
Else
new_height = Math.Floor(target_width / image_ratio)
new_width = target_width
End If
final_image = New Bitmap(target_width, target_height)
graphic = Graphics.FromImage(final_image)
graphic.FillRectangle(New SolidBrush(Color.White), New Rectangle(0, 0, target_width, target_height))
Dim paste_x As Integer = (target_width - new_width) / 2
Dim paste_y As Integer = (target_height - new_height) / 2
graphic.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
graphic.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
graphic.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
graphic.CompositingMode = Drawing2D.CompositingMode.SourceOver
graphic.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
graphic.TextRenderingHint = Text.TextRenderingHint.AntiAliasGridFit
graphic.DrawImage(original_image, paste_x, paste_y, new_width, new_height)
Dim myEncoders() As Imaging.ImageCodecInfo = Imaging.ImageCodecInfo.GetImageEncoders()
Dim encoderParameters As System.Drawing.Imaging.EncoderParameters
encoderParameters = New System.Drawing.Imaging.EncoderParameters(1)
encoderParameters.Param(0) = New Imaging.EncoderParameter(Imaging.Encoder.Quality, 100L)
final_image.Save(ms, myEncoders(1), encoderParameters)
Catch ex As Exception
'錯誤處理 請自行修改
'response.write(ex.Message)
Finally
If Not original_image Is Nothing Then original_image.Dispose()
If Not final_image Is Nothing Then final_image.Dispose()
If Not graphic Is Nothing Then graphic.Dispose()
End Try
Return ms
End Function