2013-04-07 44 views
1

如何将Gdk.Pixbuf(_pixbuf在下面)转换为Windows窗体(System.Drawing)位图?以下是使用Gtk.DotNet.Graphics的代码,但它仅显示白色图像。有更好,更直接的方法吗?我在Mono上使用C#,但如果你有其他语言的答案,我可以转换。将Gdk.Pixbuf转换为System.Drawing.Bitmap?

public System.Drawing.Bitmap toBitmap() { 
    Gdk.Pixmap pixmap, mask; 
    _pixbuf.RenderPixmapAndMask(out pixmap, out mask, 255); 
    System.Drawing.Graphics graphics = Gtk.DotNet.Graphics.FromDrawable(pixmap); 
    return new System.Drawing.Bitmap(width, height, graphics); 
} 

回答

2

您可以使用此方法扩展:

using System.ComponentModel; 
using System.Drawing; 

public static class MyExtensions 
{ 
    public static System.Drawing.Bitmap ToBitmap(this Pixbuf pix) 
    { 
     TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); 

     //// Possible file formats are: "jpeg", "png", "ico" and "bmp" 
     return (Bitmap)tc.ConvertFrom(pix.SaveToBuffer("jpeg")); 
    } 
} 

用法:

{ 
    Pixbuf pxb = new Pixbuf(pixSource); 
    Bitmap bmp = pxb.ToBitmap(); 
} 
+0

很不错的!便利和简单的一个包装! – 2013-04-08 11:36:20

+0

它似乎没有工作(指定png,jpeg或bmp)pixbuf与透明度...可能是Gdk.Pixbuf.SaveToBuffer()中的一个错误,或在位图的缓冲区读取(我正在使用单声道)。将尝试首先删除透明度... – 2013-04-08 12:12:34

+0

今天早上尝试了它。适用于纯PNG和ICO,而不适用于BMP和JPEG。虽然JPEG根本不支持透明度,但BMP支持alpha通道。不知道为什么BMP不能在这里工作。 – 2013-04-09 02:38:13