2010-11-03 6 views
2

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

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

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 

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

EDIT: Подстановка img.Save (ImageCachePath, GetFormat (MimeType)) для вызова с тремя аргументами. Сохранение по-прежнему приводит к статическому gif.

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

Приветствия, Matt

ответ

0

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

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

Смежные вопросы