拯救和调整dotnet中的GIF大小 - 如何保留动画?

时间:2010-11-03 09:33:27

标签: .net animated-gif

我已经在我当前的应用程序中编写了数百行图像管理代码,所有这些代码似乎运行得很好......除了上传的GIF在它的某个地方放松了他们的动画。我已经将问题追溯到将图像保存到磁盘(为了缓存它们)直接从数据库显示它们(它们存储为blob)的程度,它们看起来很好。

这是代码 - 有一堆我自己没有列出的自定义对象和函数的调用,但我不相信它们与问题有关 - 我认为这是在这两个关键函数中的某个地方:

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

感激地收到任何建议。

编辑:将.save(ImageCachePath,GetFormat(MimeType))替换为.Save的三参数调用仍会产生静态gif。

编辑2:实际上对GIF做几乎任何事情似乎都会让它停止动画!尝试使用Canvas调整大小,尝试使用量化来预测质量似乎搞砸了动画。

干杯, 马特

1 个答案:

答案 0 :(得分:0)

好的,据我所知,这不是现在可能的。至少没有任何合理的努力。通过在WPF上使用调整大小方法看起来似乎可能,但遗憾的是,WPF用于winforms而不是ASP,渲染看起来像是一场噩梦 - 可以通过使用Ajax更新面板来解决它在加载时为动画的每个帧刷新内容。不,谢谢!

令我惊讶的是,你不能在不丢失动画信息的情况下弄乱动画图像,特别是在这种成熟的技术中!