Xpoint
   [напомнить пароль]

Изменение размера картинки на сервере "на лету"

Метки: [без меток]
2010-03-28 20:50:44 [обр] Alexey V.Zelenin(0/8)[досье]

Задача довольно простая: изменять размер картинки на сервере, добавляя некий watermark. Ресайз происходит без проблем, ватермарк тоже добавляется, но у некоторых картинок почему-то появляется чёрный фон. Предполагаю, что это происходит потому, что в оригинале берётся картинка GIF с прозрачностью, и как раз "прозрачный" цвет при конвертации в JPEG превращается в чёрный. Может быть есть возможность заменять произвольный прозрачный цвет на белый или просто сохранять в GIF же? Что посоветует общественность?

Вот код, который используется:

  1. imageUrl - вычисленный физический адрес файла с картинкой
  2. width и height - берутся из Request.
        Dim fullSizeImg As System.Drawing.Image
        fullSizeImg = System.Drawing.Image.FromFile(imageUrl)

        Dim tempRatio As Double

        If Request.QueryString("width") <> "" Then

            If fullSizeImg.Size.Width <= Request.QueryString("width") Then
                SaveImageToResponse(fullSizeImg)
                Response.End()
            End If

            tempRatio = fullSizeImg.Size.Width / fullSizeImg.Size.Height
            If fullSizeImg.Size.Width <= Request.QueryString("width") Then
                width = fullSizeImg.Size.Width
            Else
                width = Request.QueryString("width")
            End If

            imageHeight = (width / tempRatio)
            imageWidth = width
        Else
            If fullSizeImg.Size.Height <= Request.QueryString("height") Then
                SaveImageToResponse(fullSizeImg)
                Response.End()
            End If

            tempRatio = fullSizeImg.Size.Height / fullSizeImg.Size.Width
            If fullSizeImg.Size.Height <= Request.QueryString("height") Then
                height = fullSizeImg.Size.Height
            Else
                height = Request.QueryString("height")
            End If

            imageHeight = height
            imageWidth = (height / tempRatio)
        End If

        'Do we need to create a thumbnail?
        Response.ContentType = "image/jpeg"
        If imageHeight > 0 And imageWidth > 0 Then
            Dim dummyCallBack As System.Drawing.Image.GetThumbnailImageAbort
            dummyCallBack = New _
               System.Drawing.Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback)

            Dim thumbNailImg As System.Drawing.Image
            thumbNailImg = fullSizeImg.GetThumbnailImage(imageWidth, imageHeight, _
                                                         dummyCallBack, IntPtr.Zero)


            SaveImageToResponse(thumbNailImg)
        Else
            SaveImageToResponse(fullSizeImg)
        End If

И дальше вспомогательные методы

    Function ThumbnailCallback() As Boolean
        Return True
    End Function

    Sub SaveImageToResponse(ByRef image As Image)
        If ConfigurationManager.AppSettings("min_watermark_width") <> "" Then
            If image.Width >= CType(ConfigurationManager.AppSettings("min_watermark_width"), Integer) Then
                'image = AddWatermark(image)
            End If
        Else
            image = AddWatermark(image)
        End If

        image.Save(Response.OutputStream, ImageFormat.Jpeg)
        image.Dispose()
    End Sub

    Function AddWatermark(ByRef bitmap As Bitmap) As Bitmap
        AddWatermark = AddWatermark(bitmap, _
                                    ConfigurationManager.AppSettings("watermark_text"), _
                                    Color.Gray, 50, "Tahoma", _
                                    FontStyle.Regular, 9)
    End Function
    Function AddWatermark(ByRef bitmap As Drawing.Bitmap, _
                          ByVal watermarkText As String, _
                          ByVal textColor As Drawing.Color, _
                          ByVal opacityPercent As Integer, _
                          ByVal fontFamily As String, _
                          ByVal fontStyle As Drawing.FontStyle, _
                          ByVal maxFontSize As Integer) _
                          As System.Drawing.Bitmap

        Dim opacity As Integer = CType(255 * opacityPercent / 100, Integer)
        Dim gr As Graphics
        Try
            gr = Graphics.FromImage(bitmap)

        Catch ex As Exception
            Dim bmpNew As Bitmap = New Bitmap(bitmap.Width, bitmap.Height)
            gr = Graphics.FromImage(bmpNew)
            gr.DrawImage(bitmap, New Rectangle(0, 0, bmpNew.Width, bmpNew.Height), 0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel)
            bitmap = bmpNew
        End Try

        Dim semiTransparentBrush As Brush
        'semiTransparentBrush = 
        semiTransparentBrush = New SolidBrush(Color.FromArgb(opacity, textColor))
        Dim watermarkFont As Font = New Font(fontFamily, maxFontSize)
        gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
        gr.DrawString(watermarkText, watermarkFont, semiTransparentBrush, New Point(0, 0))

        watermarkFont.Dispose()
        semiTransparentBrush.Dispose()

        AddWatermark = bitmap
    End Function
спустя 2 минуты [обр] Alexey V.Zelenin(0/8)[досье]
Прилагается оригинальная картинка, с которой имеются проблемы.
спустя 12 часов [обр] Филипп Ткачев(1/112)[досье]
Попробуйте создать изображение с белым фоном, на него положите свой GIF, а затем watermark.
Powered by POEM™ Engine Copyright © 2002-2005