首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将位图转换为GDK# PixBuff

将位图转换为GDK# PixBuff
EN

Stack Overflow用户
提问于 2013-12-11 08:29:08
回答 3查看 3.1K关注 0票数 3

如何将System.Drawing.Bitmap转换为GDK# Image,以便设置为图像小部件。

我试过这个..。

代码语言:javascript
代码运行次数:0
运行
复制
System.Drawing.Bitmap b = new Bitmap (1, 1);
Gdk.Image bmp = new Gdk.Image (b);

更新:

代码语言:javascript
代码运行次数:0
运行
复制
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;

例外:

代码语言:javascript
代码运行次数:0
运行
复制
    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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-11 08:53:01

一种丑陋但有效的方法是将位图存储为MemoryStream中的PNG。

要保存Bitmap,可以使用 method

代码语言:javascript
代码运行次数:0
运行
复制
b.Save(myMemoryStream, ImageFormat.Png);

那很容易。将PNG数据加载到Pixbuf中也相当容易;您可以使用适当的构造函数:

代码语言:javascript
代码运行次数:0
运行
复制
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:在测试您的代码之后,我发现在您能够运行您的最小示例之前,还有三个额外的先决条件需要确保:

  • 如前所述,必须将流位置重置为“保存Bitmap后”开始,然后加载Pixbufms.Position = 0;
  • 您必须编译x86 CPU的应用程序。
  • 您必须在使用Gtk.Application.Init();之前调用Pixbuf
票数 2
EN

Stack Overflow用户

发布于 2013-12-11 10:13:24

您可以像在Winforms中那样在Gtk#中绘制。为此,您必须获得System.Drawing.Graphics对象,然后可以在其上绘制线条、图像和文本。您可以这样做: 1.创建新的Widget。2.订阅ExposeEvent。3.在事件处理程序上编写一些代码:

代码语言:javascript
代码运行次数:0
运行
复制
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.上添加引用

票数 1
EN

Stack Overflow用户

发布于 2013-12-11 08:50:11

试试这个..。

代码语言:javascript
代码运行次数:0
运行
复制
Gdk.Pixbuf pixbufImage = mew Gdk.Pixbuf(@"images/test.png");
Gtk.Image gtkImage = new Gtk.Image(pixbufImage);
Gdk.Image gdkImage = gtkImage.ImageProp;
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20514115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档