c# - 将位图转换为 GDK# PixBuf

标签 c# bitmap gtk# gdkpixbuf

如何将 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;

异常(exception):

    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 窗体的 PictureBox ,而 Gdk.Pixbuf 大致相当于 Windows 窗体的 System.Drawing.Bitmap .

EDIT2:在测试您的代码后,我发现在您可以运行最小示例之前需要确保三个额外的先决条件:

  • 如上所怀疑,您必须将流位置重置为 after 保存您的 Bitmapbefore 加载您的 Pixbuf: ms.Position = 0;
  • 您必须为 x86 CPU 编译应用程序。
  • 在使用 Pixbuf 执行任何操作之前,您必须调用 Gtk.Application.Init();

关于c# - 将位图转换为 GDK# PixBuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20514115/

相关文章:

c# - 如何检测应用于 Gtk# TextView 中文本的标签?

c# - 我应该将多个项目之间共享的属性放在哪里?

c# - 如何将不同数据类型的项目添加到列表中

android - 将字符串文本转换为位图

java - 如何在android中调整位图图像对比度?

c# - 将 Gtk# NodeView 绑定(bind)到 IList?

c# - 在 UI 线程上报告后台线程进度

c# - 内存分配问题?

java - Android 中的位图内存管理

c# - 如何将 Mono GTK# 应用程序移植到其他平台?