gpt4 book ai didi

vb.net - 打印/图形问题

转载 作者:行者123 更新时间:2023-12-03 15:49:18 25 4
gpt4 key购买 nike

语言:
VB .NET 2010 Win 表格

范围:
我开发了一个标签打印程序,旨在将自定义标签打印到 zebra 打印机。当我尝试将整个标签打印为图像时,打印机的清晰度有问题,因此我尝试将标签中的所有文本存储到一个数组中,清除标签,将剩余的图像发送到打印机,然后根据存储的数组覆盖新文本。此结果旨在将文本而不是图像发送到打印机。

问题:
结果标签对文本非常清晰,因为我想要它,但是我在对齐打印方法时遇到了麻烦。对于测试,我将原始图像与顶部的叠加文本一起显示,它们应该完美对齐或在合理范围内接近。这样做的结果是它们没有对齐。

测试:

    Dim g2 As Graphics
g2 = Form1.PictureBox2.CreateGraphics
g2.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
g2.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
g2.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g2.Clear(Color.White)

g2.DrawImage(largeimage, New Point(0, 0))

Dim myBrush As Brush
Dim i As Integer = 0
Do Until i = label_array.Count - 1
myBrush = New SolidBrush(label_array(i).ForeColor)
g2.DrawString(label_array(i).Text, label_array(i).Font, myBrush, label_array(i).Location)
i = i + 1
Loop

在打印方法中,我使用上述方法将覆盖图和图像输出到图片框。这样做时它有效,但是......
    e.Graphics.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
e.Graphics.Clear(Color.White)

e.Graphics.DrawImage(largeimage, New Point(0, 0))

i = 0
Do Until i = label_array.Count - 1
myBrush = New SolidBrush(label_array(i).ForeColor)
e.Graphics.DrawString(label_array(i).Text, label_array(i).Font, myBrush, label_array(i).Location)
i = i + 1
Loop

..对上面显示的打印图形进行操作会导致未对齐...

欢迎任何想法,因为我会尝试任何事情。我猜测打印图形正在做一些我不知道的普通图形的额外操作。

我确实注意到与 DrawString 相比,TextRenderer.DrawText 改进了结果。然而,当使用它时,结果似乎是通过一些未知的缩放因子从原始缩放的......

下面是原始顶部的叠加结果:
enter image description here

最佳答案

您正在重新发现 Graphics.DrawString() 的一个众所周知的问题,它不准确。这个问题最形象的演示是这个示例 Winforms 表单:

public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e) {
e.Graphics.DrawString("Hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
this.Font, Brushes.Black, 0, 0);
}
}

看起来像这样:

enter image description here

再多的魔法都不会让你在字符串的部分重叠,在那里我的字母之间的间距突然改变了。 GDI+ 是微软首次尝试独立于分辨率的文本渲染,但效果不佳。这是一个很好的公司,WPF 是第二次尝试,它在模糊输出方面受到了很多批评。以类似于在 .NET 2.0 中为 Winforms 修复的方式解决,您应该始终使用 TextRenderer.DrawText() 将文本渲染到窗口。它不会尝试使渲染的文本平滑缩放,它总是更喜欢适合像素网格。与 WPF 的理想与显示渲染模式相同, added in .NET 4 .

您的方法还有其他重大问题,文本的呈现方式明显不适合打印机。您可以看到,当您放大时可以看到像素,SysInternals 的 ZoomIt 实用程序对此很有用。我放大了您右侧图形中的字母 a:

enter image description here

注意字母形状边缘的红色和蓝色像素。这是一种称为 ClearType 的抗锯齿技术,它提高了液晶显示器的感知分辨率。它只适用于 LCD 面板,它确实适用 不是 在没有相同条纹图案的打印机上工作。在纸上,这封信看起来很模糊,带有彩色条纹。尽管在 Zebra 打印机上没有那么糟糕,因为它不支持彩色打印。

这些是特定于将文本渲染到显示器、分辨率相当差的设备的工件。像素网格拟合和 ClearType 是使文本看起来不错的技巧。典型的显示器每英寸不超过大约 120 个像素。尽管随着苹果对“视网膜”显示器的插入,这种情况终于有所改善。一家拥有高分辨率显示器股份的公司,他们传统上呈现文本 in "ideal" mode .

这些渲染技巧完全不适合打印机,一种具有更高分辨率的设备。每英寸 600 像素是典型的,比显示器好 5 倍。通过在打印机上绘制一个图片框,您实际上是 浪费直接在打印机上绘图时将获得的改进。它们的差异非常显着,用肉眼很容易看到。当您以 600 dpi 渲染文本时,文本看起来更加漂亮和清晰。最初为 120 dpi 渲染并为打印机放大的文本看起来“有 Blob ”和粗糙。

始终使用 PrintDocument 类绘制到打印机。

关于vb.net - 打印/图形问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15029237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com