我有一个应用程序来处理从客户主机发送的SVG消息。嵌入在该消息中的是几个图像,其中一个是2D(PDF-417)条形码。我有一个主画布,用于渲染SVG消息中包含的所有各种元素,包括文本和其他一些图像或图标。除了渲染2D条形码外,一切都很有效。 2D条形码被渲染到画布上,看起来非常干净和锐利,但没有条形码阅读器可以读取条形码。如果我保存从主机下载的原始条形码,我可以用任何阅读器扫描它。不仅我可以缩放它,旋转它,几乎做任何事情,我只能扫描渲染到主画布的最终条形码。
我正在使用Graphics.DrawImage将条形码位图绘制到主画布。
_innerGraphics.SmoothingMode = SmoothingMode.None;
_innerGraphics.DrawImage(image, destRect, srcRect, graphicsUnit);
仔细检查原始位图和渲染到主画布的图像确实显示出一些差异,但不是2D条形码专家而且没有非常昂贵的条形码分析器工具使得很难确定究竟出了什么问题。
2D(PDF417)条形码的难点在于图像必须精确或BCR(条形码阅读器)无法扫描图像。
***********已添加内容****** 是的,我看到了。在大多数情况下,我同意你的观点。但是,通过在这里与其他工程师进行大量阅读,试验和讨论问题,我/我们提出了以下3个选项,我们将其应用于Graphics对象属性“InterpolationMode。
// good - innerGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
// GOOD _innerGraphics.InterpolationMode = InterpolationMode.HighQualityBilinear;
_innerGraphics.InterpolationMode = InterpolationMode.High;
我把它设置在InterpolationMode.High暂时用于测试目的。现在渲染的图像非常好。令人困惑的项目是渲染的图像,现在仍然有你指出的那些不相等的线条以及我猜想应该让它失败的一些其他项目。
其他信息: 我应该知道的更多项目。 SVG引擎通过C#Graphics对象呈现的主画布具有Format32bppArgb的像素格式。包含从客户的WEB站点下载的条形码的位图是Format24bppRgb。条形码图像通过Graphics.DrawImage()呈现到主画布。 我认为Graphics对象正在尽力将24bppRgb格式转换为32bppArgb格式,从而导致失真。如果我只是打印原始的24位位图图像,它会创建一个漂亮的位图。它看起来像一个尖锐的1位单色图像。 我有点不知道将这个条形码位图渲染到主绘图画布上的确切/正确是什么。到目前为止,我必须相信我的成功或多或少地猜测工作。
如果可能,我会尝试附加2个位图以供查看。
图片不好:Bad final image 好图像:Good image
有人可以帮忙吗?
9/1/2017 - 更新 今天早上,我从渲染2D条形码所需的SVG库中推断出代码的核心部分。我在重建问题上有所成功。接下来,我开始调整一些数学和值,以了解不同的功能点如何影响条形码到主画布的渲染。我现在可以渲染几乎任何我想要的尺寸的2D条形码(非常合理)并渲染出漂亮的完美2D条形码。 有些调整我还不太清楚我还明白,但曾经模糊不清的东西正慢慢开始成为焦点。开始了解发生了什么。简而言之,它是渲染到主画布时的源矩形和目标矩形计算。 经过大量测试和实验后,我很确定问题已经归结为缩放。我向您发送outputorig.bmp大小的原始位图是808 x 175.这是我从客户主机收到它的方式。我无法控制它的大小。必须将此位图渲染为主画布245 x 94上的矩形。这大约是其原始大小的30%。我可以通过使用我在WEB上找到的各种缩放例程成功地将其缩小到某种程度。我已经能够将它缩小到原始尺寸的大约60%,并且仍然能够扫描条形码。我远远超出了它,它变得无法扫描。 任何人的想法?
由于 Al Harper