我有一个包含6个位图图像的列表,如果我将它们保存为.png文件,每个图像都会自动生成,它们占用大约200-300 KB的磁盘空间。
当我将它们保存到单个.tif时,它们会爆炸到大约10 MB的tif文件。
将质量参数设置为10(我认为这是非常低的),将其降低到9.5,仍然与应该的大约1.5 MB相差甚远。
图像主要是彩色扫描文档(32bpp)
以下是代码:
Function ImagesTif(Images As IEnumerable(Of Image)) As MemoryStream
Dim tif = Images(0)
Dim stmTiff = New MemoryStream
Dim encoderInfo = ImageCodecInfo.GetImageEncoders.First(Function(i) i.MimeType = "image/tiff")
Dim tifParams = New EncoderParameters(2)
Dim prmCompress = New EncoderParameter(Encoder.Quality, 10)
tifParams.Param(0) = prmCompress
tifParams.Param(1) = New EncoderParameter(Encoder.SaveFlag, EncoderValue.MultiFrame)
tif.Save(stmTiff, encoderInfo, tifParams)
Dim imgParams = New EncoderParameters(2)
imgParams.Param(0) = prmCompress
imgParams.Param(1) = New EncoderParameter(Encoder.SaveFlag, EncoderValue.FrameDimensionPage)
For Each img In Images.Skip(1)
tif.SaveAdd(img, imgParams)
Next
Dim endParams = New EncoderParameters(1)
endParams.Param(0) = New EncoderParameter(Encoder.SaveFlag, EncoderValue.Flush)
tif.SaveAdd(endParams)
Return stmTiff
End Function
请告知
谢谢!
更新1
最初我使用LZW压缩,但由于它给了我10MB文件,我尝试了Quality
压缩。这是原始(LZW)代码:
Dim encoderInfo = ImageCodecInfo.GetImageEncoders.First(Function(i) i.MimeType = "image/tiff")
Dim tifParams = New EncoderParameters(2)
Dim cmprs = EncoderValue.CompressionLZW
Dim prmCompress = New EncoderParameter(Encoder.Compression, cmprs)
所有其余内容与上面的代码相同。
到目前为止,两者都没有给出预期的结果。
更新2
根据@haraldK的建议,我发现了一些可以使用zip
压缩进行压缩的代码。
所以这是我的新代码:
Function ImagesTif(Images As IEnumerable(Of Image)) As MemoryStream
Dim stream = New MemoryStream 'As New FileStream("new.tif", FileMode.Create)
Dim encoder As New System.Windows.Media.Imaging.TiffBitmapEncoder()
encoder.Compression = System.Windows.Media.Imaging.TiffCompressOption.Zip
For Each img In Images
Dim strmBmap = img.AsBitmap.ToStream 'a helper function to turn a bitmap into a stream
strmBmap.Position = 0
encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(strmBmap))
Next
encoder.Save(stream)
Return stream
End Function
但是这个代码也提供了一个9.8 MB的文件,而不是大约1.5 MB。
是什么给出了?