保存到tif膨胀图像

时间:2016-10-30 16:41:29

标签: .net bitmap compression tiff

我有一个包含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。

是什么给出了?

0 个答案:

没有答案