Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 印刷/图形问题_Vb.net_Graphics_Printing_Vb.net 2010 - Fatal编程技术网

Vb.net 印刷/图形问题

Vb.net 印刷/图形问题,vb.net,graphics,printing,vb.net-2010,Vb.net,Graphics,Printing,Vb.net 2010,语言: VB.NET2010获奖表格 范围: 我开发了一个标签打印程序,旨在将自定义标签打印到zebra打印机上。当我尝试将整个标签打印为图像时,打印机的清晰度出现问题,因此我尝试将标签中的所有文本存储到数组中,清除标签,将剩余图像发送到打印机,并根据存储的数组覆盖新文本。此结果旨在向打印机发送文本,而不是图像 问题: 结果标签对于我想要的文本来说非常清晰,但是我的打印方法在对齐方面遇到了问题。对于测试,我将原始图像显示在叠加文本的顶部,它们应该完全对齐或在合理范围内接近。这样做的结果是它们没有

语言: VB.NET2010获奖表格

范围: 我开发了一个标签打印程序,旨在将自定义标签打印到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
…对上面显示的打印图形执行此操作会导致未对齐

任何想法都欢迎,因为我会尝试任何事情。我猜打印图形是从一个我不知道的普通图形做了一些额外的事情


我注意到TextRenderer.DrawText与DrawString相比提高了结果。然而,当使用这个结果似乎是从原来的一些未知的比例因子缩放

下面是原始图形顶部的结果覆盖:

很久以前,我写了一个将标签打印到Zebra打印机的应用程序,也许我能帮上忙。在那一天,我们只有ZPL2API,只有打印的文本和简单的图形,没有这些图像的东西。无论如何

我怀疑这是一个规模问题。这也许可以解释为什么你的原始图像是模糊的——也许打印机正在自动尝试缩放它以适应标签,但它做得很差?当然,这可以解释上面显示的结果标签

上面的代码让我印象深刻的是如何获得图形对象。一个来自图片框;另一个可能来自打印机。请记住,图形对象依赖于设备。也就是说,它的属性和打印方式取决于您是打印到特定控件(不同控件可以具有不同的缩放比例)还是打印到特定打印机


您是否尝试过使用现有代码打印到激光打印机?看到结果可能会很有趣。另请参见ScaleTransform等图形属性。

您正在发现图形的一个众所周知的问题。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);
    }
}
看起来是这样的:

再多的魔法也无法让你在字符串的某个部分重叠,字母i之间的间距突然改变。GDI+是微软第一次尝试独立于分辨率的文本呈现,但效果并不理想。这是在良好的公司,WPF是第二次尝试,它得到了模糊输出很多高射炮。解决方法与在.NET 2.0 for Winforms中修复的方法类似,您应该始终使用TextRenderer.DrawText()将文本渲染到窗口。它并不试图使渲染文本平滑缩放,它总是倾向于拟合像素网格。与WPF的理想与显示渲染模式相同

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

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

这些是特定于向监视器呈现文本的工件,这些设备的分辨率相当低。像素网格拟合和ClearType是使文本看起来像样的技巧。典型的显示器每英寸不超过120像素。尽管随着苹果推出“视网膜”显示器,这一点终于有所改善。作为一家拥有高分辨率显示器股份的公司,他们传统上提供文本

这些渲染技巧完全不适用于分辨率高得多的打印机。每英寸600像素是典型的,很容易比显示器好5倍。通过在打印机上绘制一个图片盒,实际上是在浪费直接在打印机上绘制时得到的改进。它们之间的差异非常显著,并且很容易用肉眼看到。当以600 dpi渲染文本时,文本看起来更漂亮、更清晰。最初以120 dpi的速度渲染并放大以供打印机使用的文本看起来“块状”且粗糙


始终使用PrintDocument类在打印机上绘图。

在创建新画笔之前,不要忘记处理旧画笔。请注意,打印
矩形
总是从屏幕上的
(0,0)
开始,而不是从打印机上开始。检查打印矩形
.Left
.Top
属性,并相应地偏移文本。边距边界=(100100)和页面边界=(0,0),因此我看不到真正的相关性。因此,我假设您讨论的是TextRenderer.DrawText方法,并尝试检查该方法与打印机图形比例的比例?我会试试那个,然后就可以了