close

碰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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 longlang0616 的頭像
    longlang0616

    八咫烏的天空

    longlang0616 發表在 痞客邦 留言(1) 人氣()