在我当前的应用程序中,我已经编写了几百行图像管理代码,所有这些似乎都很好地工作…除了上传的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做任何事情都会阻止它动画化!尝试使用画布调整它的大小,并尝试使用量化来预设质量,所有这些似乎都会使动画混乱。
干杯,
马特