Benutzer mit den meisten Antworten
Image aus Clipboard ausfragen

Frage
-
Ich muss aus der Zwischenablage ein Image laden und dieses dann in einer WPF richTextBox anzeigen. Ich habe einen Windows Hook eingerichtet, der auch erreicht wird. Soweit kein Problem. Bei Texten funktioniert es auch.
if (e.content.GetDataPresent(DataFormats.Text)) { string s = (string)e.content.GetData(DataFormats.Text); Paragraph p = new Paragraph(new Run(s)); richTextBoxClipboard.Document.Blocks.InsertBefore(richTextBoxClipboard.Document.Blocks.FirstBlock, p); } else if (e.content.GetDataPresent(DataFormats.Bitmap)) { drw.Image img = (drw.Image)e.content.GetData(DataFormats.Bitmap, true); Paragraph p = new Paragraph(); Image i = Koopakiller.Convert.wf2wpfImage(img); p.Inlines.Add(i); richTextBoxClipboard.Document.Blocks.InsertBefore(richTextBoxClipboard.Document.Blocks.FirstBlock, p); }
Jedoch kommt es beim Debuggen nie über die Zeiledrw.Image img = (drw.Image)e.content.GetData(DataFormats.Bitmap, true);
hinweg.
Woran liegt das?
Koopakiller - http://koopakiller.ko.ohost.de/
Antworten
-
Hallo,
Du solltest gleich die WPF Clipboard Klasse verwenden, die auch eine GetImage Methode bereitstellt.
Auch wenn der Name irreführend ist und es eher eine GetImageSource Methode ist, was dann etwas
Zusatzaufwand macht:public static BitmapImage CreateImageFromClipboard() { if (!Clipboard.ContainsImage()) return null; var jpegStream = new System.IO.MemoryStream(); BitmapSource bitmapSource = Clipboard.GetImage(); var encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmapSource)); encoder.Save(jpegStream); jpegStream.Position = 0; var image = new BitmapImage(); image.BeginInit(); image.StreamSource = jpegStream; image.EndInit(); return image; }
siehe dazu auch: http://stackoverflow.com/questions/5338253/bitmapsource-to-bitmapimage
Und getestet mit:
if (Clipboard.ContainsImage()) { var p = new Paragraph(); var image = new Image(); image.Source = CreateImageFromClipboard(); p.Inlines.Add(image); this.richTextBox1.Document.Blocks.Add(p); p.Inlines.Add("Ein Bild"); }
Gruß Elmar
- Als Antwort markiert Tom Lambert (Koopakiller)Moderator Sonntag, 1. April 2012 18:08
Alle Antworten
-
Das ist es ja, ich setze einen BreakPoit bei der besagten Zeile und mache Schrit für Schritt mit F11 weiter.
Ich lande sofort in der WndProc-Methode und durchlaufe diese gefühlte 1000 mal. besonders oft hat msg den Wert 127, aber auch andere wie 28 kommen des öffteren vor.
Exceptions, auch innere, gibt es keine.
Koopakiller - http://koopakiller.ko.ohost.de/
-
Hallo,
Du solltest gleich die WPF Clipboard Klasse verwenden, die auch eine GetImage Methode bereitstellt.
Auch wenn der Name irreführend ist und es eher eine GetImageSource Methode ist, was dann etwas
Zusatzaufwand macht:public static BitmapImage CreateImageFromClipboard() { if (!Clipboard.ContainsImage()) return null; var jpegStream = new System.IO.MemoryStream(); BitmapSource bitmapSource = Clipboard.GetImage(); var encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmapSource)); encoder.Save(jpegStream); jpegStream.Position = 0; var image = new BitmapImage(); image.BeginInit(); image.StreamSource = jpegStream; image.EndInit(); return image; }
siehe dazu auch: http://stackoverflow.com/questions/5338253/bitmapsource-to-bitmapimage
Und getestet mit:
if (Clipboard.ContainsImage()) { var p = new Paragraph(); var image = new Image(); image.Source = CreateImageFromClipboard(); p.Inlines.Add(image); this.richTextBox1.Document.Blocks.Add(p); p.Inlines.Add("Ein Bild"); }
Gruß Elmar
- Als Antwort markiert Tom Lambert (Koopakiller)Moderator Sonntag, 1. April 2012 18:08