3

如何将 a 转换System.Drawing.BitmapGDK# 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)
4

3 回答 3

2

一种丑陋但有效的方法是将位图作为 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)。请注意, aGtk.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.
于 2013-12-11T08:53:01.793 回答
1

您可以像在 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上添加参考。

于 2013-12-11T10:13:24.583 回答
-4

尝试这个 ....

Gdk.Pixbuf pixbufImage = mew Gdk.Pixbuf(@"images/test.png");
Gtk.Image gtkImage = new Gtk.Image(pixbufImage);
Gdk.Image gdkImage = gtkImage.ImageProp;
于 2013-12-11T08:50:11.537 回答