How To Print Image with GTKSharp

不羁岁月 提交于 2019-12-04 16:51:57
Dave Black

I've been struggling with Gtk.PrintOperation for a couple of days, but with your post it finally came together. The following changes to your code example works for me:

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

Also, it only seems to work for PNG type images.

With a little manipulation of Dave Black's answer, I found a way to print any image type. Supposedly, you should be able to load any image type into a Pixbuf and use the Gdk CairoHelper to paint the Pixbuf on the CairoContext. I had issues with loading from file to Pixbuf when the type was not a PNG, so I used System.Drawing.Image to load it into a byte array first.

Also, make sure this occurs on the main thread of the application. If your code is occurring on a different thread, call

        Gtk.Application.Invoke(delegate {

to invoke on the main thread.

        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);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!