如何使用GTKSharp打印图像

我正在将一个C#.NET应用程序移植到Mono .NET,以便在OSX中执行。 部分应用程序涉及打印图像。 在.NET中相当容易,主要归结为

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

在PrintDocument的PrintPage事件中。 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); 

我已经在Gtk.PrintOperation上苦苦挣扎了几天,但是随着你的post,它终于走到了一起。 您的代码示例的以下更改适用于我:

 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类型的图像。

通过对Dave Black的回答进行一些操作,我找到了一种打印任何图像类型的方法。 据说,您应该能够将任何图像类型加载到Pixbuf中,并使用Gdk CairoHelper在CairoContext上绘制Pixbuf。 当类型不是PNG时,我遇到了从文件加载到Pixbuf的问题,因此我首先使用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);