Guardar y cambiar el tamaño de GIF en Dotnet - ¿Cómo presenta la animación?
-
28-09-2019 - |
Pregunta
He escrito varios cientos de líneas de código de gestión de imágenes en mi aplicación actual, todo lo cual parece funcionar bien ... excepto que cargó GIF suelto su animación en algún lugar de la línea. He rastreado el problema hasta el punto en que las imágenes se guardan en el disco (para almacenarlas en caché) al mostrarlas directamente desde la base de datos (donde se almacenan como blobs) parecen estar bien.
Aquí está el código: hay un montón de llamadas a objetos y funciones personalizadas que no he enumerado, pero no creo que sean relevantes para el problema, creo que está en algún lugar de estas dos funciones clave:
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
Cualquier sugerencia recibida con agradecimiento.
Editar: sustituir img.save (imageCachepath, getFormat (mImetype)) por la llamada de tres argumentos a .Save todavía da como resultado un GIF estático.
Editar 2: ¡En realidad, hacer casi cualquier cosa a un GIF parece evitar que se anime! Tratar de cambiarlo usando el lienzo y tratar de presumir la calidad usando cuantificar todo para arruinar las animaciones.
Saludos, Matt
Solución
Ok, por lo que puedo ver, esto no es posible actualmente. Al menos no con una cantidad razonable de esfuerzo. Se ve como puede que Sea posible mediante el uso de los métodos de cambio de tamaño en WPF, pero lamentablemente WPF está destinado a WinForms en lugar de ASP y Renderizado parece una pesadilla: el potencial para resolverlo utilizando un Ajax UpdatePanel y refrescando el contenido para cada cuadro de la animación a medida que se carga. ¡No, gracias!
¡Me parece sorprendente que no puedas meterte con una imagen animada sin perder la información de animación, especialmente en una tecnología tan madura!