PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [mono] Windows.Forms & GTK# gemischt: Probleme mit System.IO.MemoryStream



tux#
06.06.2007, 19:23
Hmm, ich komme einfach nicht weiter.
Ich versuche ein Image aus einem Windows.Forms-Fenster mit GTK#-Methoden (Gdk.Pixbuf) zu bearbeiten. Funktioniert prinzipiell auch.
Das Problem ist, dass die Image-Objekte von Win.Forms und GTK# (logischerweise) unterschiedlich sind. Also muss ich konvertieren.

Folgendes funktioniert:



//Windows.Forms Event
void Button1Click(object sender, EventArgs e)
{
pictureBox1.Image.Save("scanfixtest.png", System.Drawing.Imaging.ImageFormat.Png);
//Instanziierung der Gdk#-Klasse
WinPixbuf picRaw = new WinPixbuf();
}

...

public class WinPixbuf
{
public Gdk.Pixbuf pb;

public WinPixbuf()
{
Gtk.Application.Init();
pb = new Gdk.Pixbuf("scanfixtest.png");
pb.Save("scanfixtest_xy.jpg", "jpeg");
}
}
Allerdings finde ich es eher suboptimal das Bild extra in einer Datei zwischenspeichern zu müssen. Und wenn ich einen stream benutze bekomme ich eine Glib.NullRefereceException bzw. "unleserliches Bildformat"...
So klappt es nicht:


void Button1Click(object sender, EventArgs e)
{
System.IO.MemoryStream buffer = new System.IO.MemoryStream();
pictureBox1.Image.Save(buffer, System.Drawing.Imaging.ImageFormat.Png);
WinPixbuf picRaw = new WinPixbuf(buffer);
}

...

public class WinPixbuf
{
private Gdk.Pixbuf pb;

public WinPixbuf(System.IO.MemoryStream stream)
{
Gtk.Application.Init();
pb = new Gdk.Pixbuf(stream);
pb.Save("scanfixtest_xy.jpg", "jpeg");
}
}


Wo ist der Hund begraben? :think:
Über den Umweg Datei klappt es wie gewünscht, warum nicht über den Stream? Wer hilft mir auf die Sprünge? :hilfe2:

Gruss
tux#

Hello World
07.06.2007, 03:57
In der Dokumentation des Konstruktors public Pixbuf (string filename) steht folgendes:
"The file format is detected automatically"
In der Dokumentation (http://www.go-mono.com/docs/index.aspx?tlink=5@ecma%3a284%23Pixbuf%2fC%2f7) des Konstruktors public Pixbuf (System.IO.Stream stream) fehlt dieser Hinweis dagegen. Vielleicht müssen die Daten ja in bereits dekodierter Form vorliegen? Ist natürlich nur eine Vermutung...

tux#
07.06.2007, 07:15
Öhm, was meinst Du denn mit dekodieren? Einen Konstruktor dem ich neben dem Stream auch das Bildformat mitgeben kann gibt es leider nicht...

Ich gehe eher davon aus, daß mein Stream nicht in Ordnung ist...

[edit]

Habs gefunden - es lag tatsächlich an meinem Umgang mit dem Stream...


void Button1Click(object sender, EventArgs e)
{
System.IO.MemoryStream buffer = new System.IO.MemoryStream();
pictureBox1.Image.Save(buffer, System.Drawing.Imaging.ImageFormat.Png);
picStream.Seek(0,System.IO.SeekOrigin.Begin);
WinPixbuf picRaw = new WinPixbuf(buffer);
}


Ende gut, alles gut...? :headup:

Gruss
tux#