【问题标题】:Printing high resolution with temporary Bitmap使用临时位图打印高分辨率
【发布时间】:2016-05-19 10:31:20
【问题描述】:

我想打印标签。如果我绘制到打印上下文 Graphics 对象,它可以正常工作。但如果我使用临时位图,所有绘制的文本都是像素化的。我认识到临时位图和打印图形对象的分辨率不同(96 dpi 与 600 dpi)。所以我更改了位图分辨率以匹配打印分辨率。所以所有绘制的文字都太大了。

我需要临时位图在打印前旋转图像。

如何正确打印此位图?

像素化代码:(看起来很糟糕,但有临时位图)

    // print event handler
    private void printPage(object sender, PrintPageEventArgs ev)
    {
        // size of the page
        Size s = Form1.getPixelFromCM(Properties.Settings.Default.LabelSize);
        // temporary bitmap object
        Bitmap bmp = new Bitmap(s.Width, s.Height);
        Graphics g = Graphics.FromImage(bmp);
        // draw text 
        labels[printLabelsIndex].PrintLabel(g);
        // draw the bitmap to the page
        ev.Graphics.DrawImage(bmp, 0, 0);
    }

这段代码产生这个打印:

高分辨率代码:(看起来不错,但我需要临时位图!)

    // print event handler
    private void printPage(object sender, PrintPageEventArgs ev)
    {
        // draw text directly to print context
        labels[printLabelsIndex].PrintLabel(ev.Graphics);
    }

这段代码产生这个打印:

【问题讨论】:

  • 您必须将位图放大 6 倍。并将其缩小 6 倍。并且不要忘记使用 Graphics.Clear() 设置其背景颜色,如果您忘记了,抗锯齿将无法正常工作。只需以正确的方式执行此操作,使用 Graphics.Transform 属性来旋转输出。 Matrix.RotateAt() 方法是一种非常方便的方法。
  • Graphics.Clear() 是一个好点。 AA 现在确实有效。但由于分辨率错误,它仍然像素化。

标签: c# .net printing


【解决方案1】:

Graphics.DrawImage 支持位图的分辨率是一件好事,尽管它有时会导致混淆,因为当人们假设拼图的所有部分都具有相同的分辨率时..

这里你需要显式设置临时Bitmap的分辨率,否则如果只是继承屏幕分辨率..:

bmp.SetResolution(600,600)

当然,现在标签的大小可能不够大..

还要注意术语的问题:分辨率可能意味着大小,即像素或打印机点,但实际上应该意味着密度,即dpi 或“每英寸点数”。

你想提高尺寸还有dpi

【讨论】:

  • 但是打印的Graphics没有更高的像素分辨率。为什么 Bitmap 对象需要它?这使得绘图更加复杂,因为它不同。
  • 嗯,就是这样。其他 DrawXXX 方法都在每像素坐标系上绘制,但 DrawImage 使用位图的 dpi。除非你通过使用两个矩形的重载来防止这种情况;但是炸毁太小的位图显然无济于事..-不知道labels[printLabelsIndex].PrintLabel(g);类/方法,我们只能提供一般性建议..
  • PrintLabel() 会生成由 g.DrawString() 绘制的文本。位置都是像素。因此,如果不进行修改,它将无法同时使用两种方式。我希望用一种方法来绘制东西是可能的。 printLabel() 应该在每个 Graphics 对象上绘制,就像最后打印一样。
  • 稍加小心,您应该能够在不计算坐标和大小的情况下设置缩放。请注意,除了位图之外,Graphics 对象还可以缩放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多