8ビットのアルファチャネルを持つ画像やテキストを印刷するのに問題があります。
ほとんどのプリンタドライバは、さまざまなレイヤーをブレンドする代わりに、いくつかのディザリングパターンを追加して、アルファチャネルを誤ってレンダリングするようです。
たとえば、この質問の最後にあるコードは、次のようなものを生成します(左の四角のディザリングに注意してください)。仮想PDFプリンター-レーザープリンター
これまでのところ、XPS仮想プリンターのみが正常に機能します。
これを回避するために私がいつも行ってきたのは、中間ビットマップでの印刷ですが、1200DPIの標準の11x8.5''ページの場合、このビットマップを保存するためだけに約400 MBのRAMが必要になり、どちらがそのようなオブジェクトを印刷する正しい方法。
ありがとう
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using System.Windows.Forms;
class Program
{
static void Main(string[] args)
{
PrintDocument printDoc = new PrintDocument();
printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
PrintDialog print = new PrintDialog();
print.Document = printDoc;
if (print.ShowDialog() == DialogResult.OK)
printDoc.Print();
}
static void printDoc_PrintPage(object sender, PrintPageEventArgs e)
{
//draw directly on the print graphics
e.Graphics.TranslateTransform(50, 50);
drawStuff(e.Graphics);
//draw on an intermediate bitmap
e.Graphics.ResetTransform();
using (Bitmap bmp = new Bitmap((int)e.Graphics.DpiX, (int)e.Graphics.DpiY))
{
bmp.SetResolution(e.Graphics.DpiX, e.Graphics.DpiY);
using (Graphics g = Graphics.FromImage(bmp))
{
g.ScaleTransform(e.Graphics.DpiX / 100, e.Graphics.DpiY / 100);
drawStuff(g);
}
e.Graphics.DrawImageUnscaled(bmp, new Point(175, 50));
}
}
private static void drawStuff(Graphics graphics)
{
Brush b1 = new SolidBrush(Color.LightGray);
Brush b2 = new SolidBrush(Color.FromArgb(50, Color.Black));
graphics.FillRectangle(b1, new Rectangle(0, 0, 100, 100));
graphics.FillRectangle(b2, new Rectangle(25, 25, 50, 50));
}
}