Сохранение и изменение размера GIF-файлов в dotnet - как сохранить анимацию? - PullRequest
2 голосов
/ 03 ноября 2010

Я написал несколько сотен строк кода для управления изображениями в моем текущем приложении, которое, кажется, работает хорошо ... за исключением того, что загруженный GIF теряет свою анимацию где-то вдоль линии. Я проследил проблему до того момента, когда изображения сохраняются на диск (для их кэширования), так как они отображаются непосредственно из базы данных (где они хранятся в виде больших двоичных объектов), и они кажутся нормальными.

Вот код - есть несколько вызовов пользовательских объектов и функций, которые я не перечислил, но я не верю, что они имеют отношение к проблеме - я думаю, что это где-то в этих двух ключевых функциях:

Private Sub CreateImageFileInCache()
    Dim CMSImage As Cms.DataTransferObjects.Image = My.Application.ManagerFactory.ImageManagerInstance.ById(ImageId)
    If CMSImage IsNot Nothing Then
        SaveMetaInfo(CMSImage)

        Using ms As New IO.MemoryStream(CMSImage.Data)
            Dim expectedSize As New Drawing.Size(Width, Height)
            Using img As System.Drawing.Image = resizeImage(System.Drawing.Bitmap.FromStream(ms), _
                                                            expectedSize, _
                                                            Drawing.Drawing2D.InterpolationMode.HighQualityBicubic, CMSImage.MimeType)
                img.Save(ImageCachePath, GetEncoderInfo(CMSImage.MimeType), GenerateEncodingParameters)
                img.Dispose()
            End Using
        End Using
    End If
End Sub


Private Function resizeImage(ByVal imgToResize As System.Drawing.Image, ByVal size As System.Drawing.Size, ByVal Quality As System.Drawing.Drawing2D.InterpolationMode, ByVal format As String) As System.Drawing.Bitmap
    Dim sourceWidth As Integer = imgToResize.Width
    Dim sourceHeight As Integer = imgToResize.Height
    Dim resizedImage As System.Drawing.Bitmap
    Dim canvas As System.Drawing.Graphics
    Dim calculatedSize As Drawing.Size = Global.Concrete.Base.Web.Controls.ProductImage.calculateNewImageSize(sourceWidth, sourceHeight, size)

    If calculatedSize.Width > imgToResize.Width AndAlso calculatedSize.Height > imgToResize.Height Then
        calculatedSize.Width = imgToResize.Width
        calculatedSize.Height = imgToResize.Height
    End If

    resizedImage = New System.Drawing.Bitmap(calculatedSize.Width, calculatedSize.Height)
    canvas = System.Drawing.Graphics.FromImage(resizedImage)
    canvas.InterpolationMode = Quality

    If Quality = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic Then
        canvas.CompositingQuality = Drawing.Drawing2D.CompositingQuality.AssumeLinear
        canvas.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
    End If
    canvas.DrawImage(imgToResize, 0, 0, calculatedSize.Width, calculatedSize.Height)
    canvas.Dispose()
    imgToResize.Dispose()

    If format.Contains("gif") Then
        Dim quantizer As Concrete.Cms.ImageManipulation.OctreeQuantizer
        quantizer = New Concrete.Cms.ImageManipulation.OctreeQuantizer(255, 8)
        resizedImage = quantizer.Quantize(resizedImage)
    End If

    Return resizedImage
End Function

Любые предложения с благодарностью приняты.

РЕДАКТИРОВАТЬ: Замена img.Save (ImageCachePath, GetFormat (MimeType)) для вызова с тремя аргументами .Save по-прежнему приводит к статическому GIF.

РЕДАКТИРОВАТЬ 2: Фактически, выполнение практически чего-либо для GIF останавливает его анимацию! Попытка изменить его размер с помощью Canvas и сохранить качество с помощью Quantizing все, похоже, испортило анимацию.

Cheers, Matt

1 Ответ

0 голосов
/ 03 ноября 2010

ОК, насколько я могу судить, ЭТО НЕ ВОЗМОЖНО.По крайней мере, без каких-либо разумных усилий.Похоже, что возможно возможно при использовании методов изменения размера в WPF, но, к сожалению, WPF предназначен для winforms, а не ASP, и рендеринг выглядит как кошмар - потенциал для его решения с помощью панели обновления Ajax и обновлениясодержимое для каждого кадра анимации при загрузке.Нет, спасибо!

Я нахожу поразительным, что вы вообще не можете связываться с анимированным изображением, не теряя информацию об анимации, особенно в такой зрелой технологии !!

...