如何将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
方法:
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窗体的System.Drawing.Bitmap
。
编辑2:在测试了你的代码后,我发现在你运行你的最低限度的代码之前,有三个额外的先决条件需要确保:
- 如上所述,您必须在保存
Bitmap
之后将流位置重置为的开头,并在加载Pixbuf
:ms.Position = 0;
之前将其重置为 - 您必须为x86CPU编译应用程序
- 在使用
Pixbuf
执行任何操作之前,必须调用Gtk.Application.Init();
您可以像在Winforms中一样在Gtk#中绘制。为此,您必须获得System.Drawing.Graphics对象,然后可以在其上绘制线条、图像和文本。您可以这样做:1。创建新的小工具。2.订阅ExposeEvent。3.在事件处理程序上编写一些代码:
protected void OnExposeEvent(object o, ExposeEventArgs e)
{
Gdk.Window window = e.Event.Window;
using (System.Drawing.Graphics graphics =
Gtk.DotNet.Graphics.FromDrawable(window))
{
// draw your stuff here...
graphics.DrawLine(new System.Drawing.Pen(System.Drawing.Brushes.Black), 0, 0, 30, 40);
}
}
您还需要在gtk dotnet.dll上添加引用.
试试这个。。。。
Gdk.Pixbuf pixbufImage = mew Gdk.Pixbuf(@"images/test.png");
Gtk.Image gtkImage = new Gtk.Image(pixbufImage);
Gdk.Image gdkImage = gtkImage.ImageProp;