none
Image aus Clipboard ausfragen RRS feed

  • 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 Zeile

    drw.Image img = (drw.Image)e.content.GetData(DataFormats.Bitmap, true);

    hinweg.

    Woran liegt das?


    Koopakiller - http://koopakiller.ko.ohost.de/

    Sonntag, 1. April 2012 13:06
    Moderator

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

    Sonntag, 1. April 2012 16:30
    Beantworter

Alle Antworten

  • Hallo Koopakiller,

    welche Ausnahmen bzw. welchen Fehlertext (innere Exceptions beachten!!) erhälst du denn?

    Viele Grüße
    Holger M. Rößler


    Kaum macht man es richtig, schon funktioniert es

    Sonntag, 1. April 2012 15:50
  • 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/

    Sonntag, 1. April 2012 16:11
    Moderator
  • 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

    Sonntag, 1. April 2012 16:30
    Beantworter
  • Danke, so funktioniert es. :)

    Koopakiller - http://koopakiller.ko.ohost.de/

    Sonntag, 1. April 2012 18:08
    Moderator