如何将System.Drawing.Bitmap
转换为GDK# Image
,以便可以设置为图像小部件。
我已经试过了...
System.Drawing.Bitmap b = new Bitmap (1, 1);
Gdk.Image bmp = new Gdk.Image (b);
更新:
Bitmap bmp=new Bitmap(50,50);
Graphics g=Graphics.FromImage(bmp);
System.Drawing.Font ff= new System.Drawing.Font (System.Drawing.FontFamily.GenericMonospace, 12.0F, FontStyle.Italic, GraphicsUnit.Pixel);
g.DrawString("hello world",ff,Brushes.Red,new PointF(0,0));
MemoryStream ms = new MemoryStream ();
bmp.Save (ms, ImageFormat.Png);
Gdk.Pixbuf pb= new Gdk.Pixbuf (ms);
image1.Pixbuf=pb;
例外:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> GLib.GException: Unrecognized image file format
at Gdk.PixbufLoader.Close()
at Gdk.PixbufLoader.InitFromStream(Stream stream)
at Gdk.PixbufLoader..ctor(Stream stream)
at Gdk.Pixbuf..ctor(Stream stream)
最佳答案
一种丑陋但可行的方法是将位图作为PNG存储在MemoryStream
中。
要保存Bitmap
,可以使用Save
method:
b.Save(myMemoryStream, ImageFormat.Png);
那很容易。将PNG数据加载到Gdk#
Pixbuf
中也很容易。您可以使用适当的构造函数:Pixbuf pb = new Gdk.Pixbuf(myMemoryStream);
您可能需要重设内存流,以便在创建
Pixbuf
之前读取位置位于流的开头。请注意:我认为这不是最好的解决方案,甚至不是“好的”解决方案。通过对数据进行序列化和反序列化,在两个面向对象的数据结构之间传输数据具有一定的代码味。我真诚地希望其他人可以提出更好的解决方案。
编辑:至于使用的库:此答案仅使用普通的GDI +(
System.Drawing.Bitmap
)和Gdk#(Gdk.Pixbuf
)。请注意,Gtk.Image
是显示Gdk.Pixbuf
的窗口小部件。因此,Gtk.Image
等效于Windows Forms的PictureBox
,而Gdk.Pixbuf
大致等效于Windows Forms的System.Drawing.Bitmap
。EDIT2:在测试您的代码后,我发现在运行最小示例之前,还有三个先决条件需要确保:
如上所述,在保存
Bitmap
之后且在加载Pixbuf
之前,必须将流位置重置为的开头:ms.Position = 0;
您必须为x86 CPU编译应用程序。
使用
Gtk.Application.Init();
进行任何操作之前,必须先调用Pixbuf
。