Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
GDI32.SetPixel() unter Vista
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

GDI32.SetPixel() unter Vista

beantworten | zitieren | melden

Hallo,

ich versuche mittels folgender Funktion ein zuvor aufgenommenes Bild (mittels gdi32.getpixel) auf den Desktop zu zeichnen. Das zuvr aufgenommene Bild speicher ich als int[][]. Das Problem an der ganzen Sache ist, dass das Bild manchmal komplett und korrekt gezeichnet wird, manchmal stimmt wohl die Höhe aber es ist nur halb so breit (also die Hälfte ist einfach abgeschnitten und wird nicht gezeichnet) und manchmal wird einfach gar nichts gezeichnet. Die Methode wird jedesmal komplett durchlaufen, das habe ich mittels Haltepunkte getestet.

Hier die Funktion:


        public void putFieldToScreen(int put_left, int put_top)
        {
            if (hDC == (System.IntPtr)0)
            {
                hDC = User32.GetWindowDC(User32.GetDesktopWindow());
            }
            for (int j = 0; j < height; j++)
            {
                for (int i = 0; i < width; i++)
                {
                    GDI32.SetPixel(hDC, put_left + i, put_top + j, (uint)pixeldata[j][i]);
                }
            }
            return;
        }

Weiß jemand ob das an Vista liegt oder doch am Code? Weiß mir langsam nicht mehr zu helfen.

Edit: Das zuvor aufgenommene Bild habe ich serialisiert und ich deserialisiere es beim Start wieder, an den Daten des Bildes kann sich also nichts ändern.

Gruß -Hades-
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von -Hades- am .
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Hat denn wirklich niemand eine Idee?
private Nachricht | Beiträge des Benutzers
jaensen
myCSharp.de - Experte

Avatar #avatar-2657.png


Dabei seit:
Beiträge: 2.760
Herkunft: München

beantworten | zitieren | melden

WTF?
Warum nimmst du nicht BitBlt oder DrawImage?
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Na ja, das könnte ich vielleicht auch und ich könnte es natürlich auch mit Direct3D machen um es zu beschleunigen oder dergleichen aber ich habe mich nunmal für SetPixel entschieden und das sollte ja theoretisch auch problemlos funktionieren.
Desweiteren liegt es nicht in meiner Absicht bei jedem Problem einfach eine Alternative vorzuziehen, da es doch auch ganz schön wäre ein Problem zu verstehen und es zu lösen.

Zum eigentlichen problem: Ich habe das problem etwas "eingegrenzt". Ich habe ein int[][] mit der Größe meiner Desktopauflösung (1280x1024) serialisiert und habe versucht das mittels SetPixel auf den Desktop zeichnen zu lassen. Das Resultat ist, dass jedesmal 2 große "Löcher" entstehen, und zwar genau zwischen den Pixeln 256 - 512 und 768 - 1024. Die "Löcher" oder besser gesagt die nicht gezeichneten Streifen gehen von oben bis unten, sind also durchgehend.

Ich hoffe dieses seltsame Verhalten kann mir jemand erklären und/oder hat einen Lösungsvorschlag für mich (außer: ersetze SetPixel durch xxx).

Gruß -Hades-
private Nachricht | Beiträge des Benutzers
jaensen
myCSharp.de - Experte

Avatar #avatar-2657.png


Dabei seit:
Beiträge: 2.760
Herkunft: München

beantworten | zitieren | melden

Davon mal abegesehen das deine Methode IMO die langsamste ist die du dir aussuchen konntest wird dir Windows einfach dein eben gezeichnetes Bild wieder übermalen...
Alerdings wenn es absolut reproduzierbar ist könnte man auch annehmen das deine Bildinformationen fehlerhaft sind...
Als Kompromiss könntest du doch auch einfach mal BitBlt oder eine andere Methode ausprobieren um deine Bilddaten zu validieren.

[EDIT]
Du könntest testweise auch mal DWM ausschalten und schauen ob dann richtig gezeichnet wird.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von jaensen am .
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Es ist absolut reproduzierbar und die Daten sind 100% korrekt. Ich habe die Daten auf einen Rechner mit Windows XP kopiert und dort wird das komplette Bild 100% korrekt gezeichnet, es ist also ziemlich sicher ein Vista-Problem. Ich habe es auch noch auf einem Laptop mit Vista getestet, da kommt exakt dasselbe Problem.

Hat keiner eine Idee?
private Nachricht | Beiträge des Benutzers
jaensen
myCSharp.de - Experte

Avatar #avatar-2657.png


Dabei seit:
Beiträge: 2.760
Herkunft: München

beantworten | zitieren | melden

Hab leider gerade kein Vista da. Aber warum sträubst du dich so die anderen Methoden wenigstens mal auszuprobieren?

[EDIT]
Andere haben das Problem wohl auch: http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.win32.programmer.gdi&tid=1677be15-6086-4c08-8fdb-425f796b7300&cat=&lang=&cr=&sloc=&p=1

Probier doch mal gdiplus...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von jaensen am .
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Na ja, was heißt sträuben, ich hab schon angefangen es mit Direct3D umzusetzen aber das mindert nicht mein Interesse die Ursache herauszufinden und wenn möglich das Problem zu lösen. Manchmal will man halt einfach etwas wissen
private Nachricht | Beiträge des Benutzers
jaensen
myCSharp.de - Experte

Avatar #avatar-2657.png


Dabei seit:
Beiträge: 2.760
Herkunft: München

beantworten | zitieren | melden

Dann frag doch bei MS-Connect ;-)
private Nachricht | Beiträge des Benutzers