3

画像ウィジェットに設定できるように変換する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)
4

3 に答える 3

2

醜いが有効な方法の 1 つは、ビットマップを PNG として .xml ファイルに保存することMemoryStreamです。

を保存するには、次のメソッドBitmapを使用できます。Save

b.Save(myMemoryStream, ImageFormat.Png);

それはとても簡単でした。PNG データをGdk#Pixbufにロードするのもかなり簡単です。適切なコンストラクターを使用できます。

Pixbuf pb = new Gdk.Pixbuf(myMemoryStream);

を作成する前に、読み取り位置がストリームの先頭になるように、メモリ ストリームをリセットする必要がある場合がありますPixbuf

注意: 私はこれが最善の解決策だとは考えていません。データをシリアライズおよびデシリアライズすることによって、2 つのオブジェクト指向データ構造間でデータを転送することには、特定のコード臭があります。他の誰かがより良い解決策を思いつくことを心から願っています。

編集: 使用されているライブラリについて: この回答では、プレーン GDI+ ( System.Drawing.Bitmap) と Gdk# ( Gdk.Pixbuf) のみを使用しています。Gtk.Imageaは、 を表示するウィジェットであることに注意してくださいGdk.Pixbuf。そのため、Gtk.Imageは Windows フォームの と同等ですが、 は Windows フォームのPictureBoxGdk.Pixbufほぼ同等System.Drawing.Bitmapです。

EDIT2:コードをテストした後、最小限の例を実行する前に、次の 3 つの前提条件を確認する必要があることがわかりました。

  • 上で疑われるように、ストリームの位置を保存した、ロードする前に、ストリームの位置を最初にリセットする必要があります。BitmapPixbufms.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 に答える