Я написал несколько сотен строк кода управления изображениями в своем текущем приложении, все из которых, похоже, работают хорошо ... кроме того, что загруженные 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