Guardar y cambiar el tamaño de GIF en Dotnet - ¿Cómo presenta la animación?

StackOverflow https://stackoverflow.com/questions/4085672

  •  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

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top