代码之家  ›  专栏  ›  技术社区  ›  Bob Tway

在dotnet中保存和调整gif的大小-如何保存动画?

  •  2
  • Bob Tway  · 技术社区  · 14 年前

    在我当前的应用程序中,我已经编写了几百行图像管理代码,所有这些似乎都很好地工作…除了上传的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
    

    感谢您的建议。

    编辑:将img.save(imagecachepath,getformat(mimetype))替换为对.save的三个参数调用,仍会导致静态gif。

    编辑2:实际上,对GIF做任何事情都会阻止它动画化!尝试使用画布调整它的大小,并尝试使用量化来预设质量,所有这些似乎都会使动画混乱。

    干杯, 马特

    1 回复  |  直到 14 年前
        1
  •  0
  •   Bob Tway    14 年前

    好吧,据我所知,目前这是不可能的。至少没有任何合理的努力。看起来确实像 可以 可以在wpf上使用调整大小的方法,但遗憾的是,wpf用于winforms而不是asp,渲染看起来像是一场噩梦-通过使用ajax更新面板和在加载时刷新动画的每一帧的内容来解决此问题。不,谢谢!

    我觉得很神奇的是,如果不丢失动画信息,你根本就无法处理动画图像,尤其是在这个成熟的技术中!!