一点背景知识:
我正在使用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感到高兴,因为没有理由"
有没有已知的解决此问题的方法,或者在处理流和图像方面我是否遗漏了一些明显的东西?
答案 0 :(得分:0)
JPEG最适合具有多种颜色,阴影和渐变的照片。典型的位深度:8(灰度)或24(全彩)。
如果你想要单色(1位),我建议再次使用JPEG,这不仅仅是因为JPEG会引入对照片无关紧要的编码伪像,但如果你原来的话会看起来像“添加辣椒和盐”源是1位。压缩它们越多,它就越多。
您应该尝试使用PNG,它没有这样的瑕疵,更适合具有锐边的数字源。
您还可以尝试使用智能调整大小算法(使用例如8位输出)将TIFF缩小50%或75%,该算法将原始中的微点转换为输出中的小梯度。我很久以前使用1位传真/扫描仪图像,实际上效果非常好。但是仍然有这些来源太久了。