从流中保存JPG文件会增加C#中的大小

时间:2016-10-24 14:56:47

标签: c# image stream twain

一点背景知识:

我正在使用WPF编写条形码图像扫描仪桌面应用程序,它可以从文件位置(以前扫描的图像)获取输入,也可以直接从扫描仪(使用NTWAIN)获取。在这两种情况下,我都会创建或获取流。

现在,当我从流中创建一个新的Bitmap并使用Encoder将其保存为JPEG文件时

"Require status checks to pass before merging"

或内置

  using (var bmp = Image.FromStream(rawStream))
        {
            EncoderParameter ratio = new EncoderParameter(Encoder.Quality, 100L);
            EncoderParameter depth = new EncoderParameter(Encoder.ColorDepth, 8L);
            EncoderParameters codecParams = new EncoderParameters(2);

            codecParams.Param[0] = ratio;
            codecParams.Param[1] = depth;
            ImageCodecInfo jpegCodecInfo = ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == ImageFormat.Jpeg.Guid);

            bmp.Save(file.FileFullPath, jpegCodecInfo, codecParams); // Save to JPG
        }

我倾向于使用更大的文件大小。当然,情况并非如此,但当我将一个小的黑白tiff文件加载到内存并以jpg编码时,肯定是正确的。

我对图像处理的了解很简陋,但我认为这是因为jpg文件的保存颜色深度为24位,而tiff图像最初存储为1位。 (黑与白)

无论我做什么,我都无法获得jpg文件以匹配原始文件的位深度。

我发现的唯一工作就是将文件重命名为" filename.jpg"并保存如此

bmp.Save(file.FileFullPath, ImageFormat.Jpeg);

但这感觉就像一个无限期工作的解决方案(作为一个附带问题,可以简单地将任何* .bmp或* tiff文件重命名为* .jpg并且它仍然可以工作吗?)

基于我的初步研究,似乎

   using (Bitmap bmp = new Bitmap(rawStream))
   {
      Save(file.FileFullPath);
   }

不支持jpeg图像中位深度的编码参数。可以理解的是,我的客户对于文件从16kb增长到200kb感到高兴,因为没有理由"

有没有已知的解决此问题的方法,或者在处理流和图像方面我是否遗漏了一些明显的东西?

1 个答案:

答案 0 :(得分:0)

JPEG最适合具有多种颜色,阴影和渐变的照片。典型的位深度:8(灰度)或24(全彩)。

如果你想要单色(1位),我建议再次使用JPEG,这不仅仅是因为JPEG会引入对照片无关紧要的编码伪像,但如果你原来的话会看起来像“添加辣椒和盐”源是1位。压缩它们越多,它就越多。

您应该尝试使用PNG,它没有这样的瑕疵,更适合具有锐边的数字源。

您还可以尝试使用智能调整大小算法(使用例如8位输出)将TIFF缩小50%或75%,该算法将原始中的微点转换为输出中的小梯度。我很久以前使用1位传真/扫描仪图像,实际上效果非常好。但是仍然有这些来源太久了。

相关问题