Печать изображений с частичной прозрачностью без искажений - PullRequest
1 голос
/ 08 марта 2011

У меня проблемы с печатью изображений и текстов с 8-битным альфа-каналом.
Похоже, что большинство драйверов принтеров неправильно отображают альфа-канал, добавляя некоторые шаблоны размывания вместо смешивания различных слоев.
Например, код в конце этого вопроса выдает что-то вроде этого (обратите внимание на дизеринг в левом квадрате): Виртуальный принтер PDF - Лазерный принтер
Пока работает только виртуальный принтер XPS.

Что я всегда делал, чтобы избежать этого, так это печать на промежуточном растровом изображении, но для стандартной страницы размером 11x8,5 дюйма с разрешением 1200 DPI потребуется около 400 МБ ОЗУ только для хранения этого растрового изображения, и теперь интересно, как правильно печатать такие объекты.
Спасибо

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));
    }
}

1 Ответ

0 голосов
/ 20 апреля 2011

Не могли бы вы использовать такую ​​библиотеку, как iTextSharp? В библиотеке есть несколько разных классов, которые будут обрабатывать изображения и шрифты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...