Zum Inhalt springen

Image Problem WPF


maniask

Empfohlene Beiträge

Hallo!

Ich habe ein großes Problem und hoffe ihr könnt mir helfen es zu lösen.

Vor kurzem habe ich eine WPF-Anwendung geschrieben, bei dem man ein Fenster über den Bildschirm zieht und sich den dahinterliegenden Bildausschnitt mit einem Farbfilter umwandeln lässt. Das umgewandelte Bild wird mit einem Image im Fenster dargestellt. Das Programm läuft unter Windows XP ohne Probleme. Unter Windows Vista und Windows 7 erscheint in dem Fenster jedoch immer ein Bild vom vorherigen umgewandelten Bild, obwohl ich das Image vor dem CopyFromScreen auf Hidden setze, es wird immer mit umgewandelt.

Mir fällt nichts mehr dazu ein. :(

Hier ein paar C# Codeausschnitte:


private void OnWindowLocationChanged(object sender, EventArgs e)

        {

            _Image.Visibility = Visibility.Hidden;

            ConvertScreenshot();

        }




private void ConvertScreenshot()

        {

            if (_Ms != null)

            {

                _Ms.Dispose();

            }


            GetBitmap();


            //hier erfolgt dann die Umwandlung von _Bmp 


            _Ms = new MemoryStream();

            _Bmp.Save(_Ms, ImageFormat.Bmp);

            _Image.Source = BitmapFrame.Create(_Ms);

            _Image.Visibility = Visibility.Visible;


        }





private void GetBitmap()

        {


                _Bmp = new Bitmap(Convert.ToInt32(ActualWidth -BorderThickness.Left - BorderThickness.Right), Convert.ToInt32(ActualHeight - BorderThickness.Top - BorderThickness.Bottom - _Menu.ActualHeight));

                Graphics g = Graphics.FromImage(_Bmp);

                g.CopyFromScreen(Convert.ToInt32(Left + BorderThickness.Left), Convert.ToInt32(Top + BorderThickness.Top + _Menu.ActualHeight), 0, 0, new System.Drawing.Size(_Bmp.Width, _Bmp.Height));


        }

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

das Problem habe ich gefunden aber leider noch keine richtige Lösung:

Das Problem ist dass das Layout deines Fenster / deiner Image vor dem Erzeugen der neuen Bitmap noch nicht geupdatet wurde, da das Erzeugen der BMP und das Updaten des Layout im selben Thread läuft und so mit dem Updaten gewartet wird während Du schon die Imageberechnest.

Bei Windows XP wird das Problem nicht auftauchen da ein WPF Fenster dort in einem Windows.Forms Container läuft.

Kopier mal folgenden Code rein. Du wirst bemerken dass es zu min. manchmal klappt (in dem Snippet ist die Zeitabstimmung zwichen dem WPF Thread und dem BMP Erzeugungsthread katastrophal aber ich hab nicht mehr so viel Zeit da meine Freundin auf der Bettkante wartet:


private Thread t;


private void test()

{

[INDENT] this.Dispatcher.Invoke(new ConvertScreenshotDelegate(ConvertScreenshot), new object[] { });[/INDENT]


}


private void ConvertScreenshot()

{

[INDENT]if (_Ms != null)

{

[INDENT] _Ms.Dispose();[/INDENT]


}


GetBitmap();


//hier erfolgt dann die Umwandlung von _Bmp 


_Ms = new MemoryStream();

_Bmp.Save(_Ms, ImageFormat.Bmp);

 _Image.Source = BitmapFrame.Create(_Ms);[/INDENT]

}


private void OnWindowLocationChanged(object sender, EventArgs e)

{

[INDENT] t = new Thread(new ThreadStart(new ConvertScreenshotDelegate(test)));

_Image.Source = null;

t.Start();[/INDENT]


}


private void GetBitmap()

{


[INDENT]_Bmp = new Bitmap(Convert.ToInt32(ActualWidth -BorderThickness.Left - BorderThickness.Right), Convert.ToInt32(ActualHeight - BorderThickness.Top - BorderThickness.Bottom - _Menu.ActualHeight));

Graphics g = Graphics.FromImage(_Bmp);

g.CopyFromScreen(Convert.ToInt32(Left + BorderThickness.Left), Convert.ToInt32(Top + BorderThickness.Top + _Menu.ActualHeight), 0, 0, new System.Drawing.Size(_Bmp.Width, _Bmp.Height));[/INDENT]
      

}

Musste halt noch was dran arbeiten aber sollte der Denkanstoß in die richtige Richtung sein :upps

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das funktioniert einigermaßen, ist aber nicht so schön, da das Image unsichtbar bleibt, solange man das Fenster bewegt. Erst wenn das Fenster irgendwo kurz zum Stillstand kommt wird das Bild umgewandelt.

Kann man nicht auch einen Screenshot ohne das oben liegende Programmfenster machen? Das würde ja alles vereinfachen, dann bräuchte man es nicht immer erst auf unsichtbar stellen.

Geht das eventuell über den Z-Index oder die Z-Order?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...