Как напечатать изображение с GTKSharp - PullRequest
2 голосов
/ 27 февраля 2012

Я портирую приложение C # .NET на Mono .NET для выполнения в OSX.Часть приложения включает в себя печать изображения.Довольно легко в .NET и сводится в основном к

e.Graphics.DrawImage(img, new Rectangle(x, y, printSize.Width, printSize.Height));

в событии PrintPocument PrintDocument.Mono не имеет полной реализации System.Drawing.Printing, поэтому кажется, что лучший способ сделать это - использовать GtkSharp.В Интернете я нашел несколько примеров того, как печатать текст с помощью Gtk.PrintOperation.У PrintOperation есть событие DrawPage, которое должно быть похоже на PrintPage, однако я мог только найти способ использовать PangoSharp для печати текста в этом событии.

Достаточно объясняя, что я знаю, я думаю, что вопрос довольно прост.Я надеюсь, что кто-то может быть полезен, поскольку печать GtkSharp плохо документирована.Если есть лучший способ сделать это за пределами GtkSharp, я все уши.

Большое спасибо.

РЕДАКТИРОВАТЬ

Так что мне удалосьчтобы что-то напечатать, однако, это всегда пустая страница.Вот код:

var print = new PrintOperation();
print.BeginPrint += (obj, args) => { print.NPages = 1; };
print.DrawPage += (obj, args) => {
    PrintContext context = args.Context;
    Cairo.Context cr = context.CairoContext;

    var imageSurface = new Cairo.ImageSurface(printImage.FileName);
    cr.MaskSurface(imageSurface, 0, 0);
};
print.EndPrint += (obj, args) => { };

print.Run(PrintOperationAction.Print, null);

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Я боролся с Gtk.PrintOperation в течение нескольких дней, но с вашим постом он наконец сошёл.Следующие изменения в вашем примере кода работают для меня:

var print = new PrintOperation();
print.BeginPrint += (obj, args) => { print.NPages = 1; };
print.DrawPage += (obj, args) => {
    PrintContext context = args.Context;
    Cairo.Context cr = context.CairoContext;

    var imageSurface = new Cairo.ImageSurface(printImage.FileName);

    int w = imageSurface.Width;
    int h = imageSurface.Height;
    cr.Scale(256.0/w, 256.0/h);
    cr.SetSourceSurface(imageSurface, 0,0); 
    cr.Paint();         

};
print.EndPrint += (obj, args) => { };

print.Run(PrintOperationAction.Print, null);

Кроме того, кажется, что это работает только для изображений типа PNG.

0 голосов
/ 04 марта 2012

С небольшими манипуляциями с ответом Дэйва Блэка я нашел способ напечатать любой тип изображения.Предположительно, вы должны быть в состоянии загрузить любой тип изображения в Pixbuf и использовать Gdk CairoHelper для рисования Pixbuf на CairoContext.У меня были проблемы с загрузкой из файла в Pixbuf, когда тип не был PNG, поэтому я использовал System.Drawing.Image, чтобы сначала загрузить его в байтовый массив.

Также убедитесь, что это происходит в основном потокеприложения.Если ваш код находится в другом потоке, вызовите

        Gtk.Application.Invoke(delegate {

для вызова в основном потоке.

        var imageBit = default(byte[]);
        var image = System.Drawing.Image.FromFile(fileName);
        using (var memoryStream = new MemoryStream()) {
            image.Save(memoryStream, ImageFormat.Png);
            imageBit = memoryStream.ToArray();
        }

        var print = new PrintOperation();
        print.BeginPrint += (obj, a) => { print.NPages = 1; };
        print.DrawPage += (obj, a) => {
                                using (PrintContext context = a.Context) {
                                    using (var pixBuf = new Gdk.Pixbuf(imageBit, image.Width, image.Height)) {
                                        Cairo.Context cr = context.CairoContext;

                                        cr.MoveTo(0, 0);
                                        Gdk.CairoHelper.SetSourcePixbuf(cr, pixBuf, image.Width, image.Height);
                                        cr.Paint();

                                        ((IDisposable) cr).Dispose();
                                    }
                                }
                            };
        print.EndPrint += (obj, a) => { };

        print.Run(PrintOperationAction.Print, null);
...