Laden...

GDI32.SetPixel() unter Vista

Erstellt von -Hades- vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.124 Views
-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren
GDI32.SetPixel() unter Vista

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-

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren

Hat denn wirklich niemand eine Idee?

2.760 Beiträge seit 2006
vor 15 Jahren

WTF?
Warum nimmst du nicht BitBlt oder DrawImage?

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren

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-

2.760 Beiträge seit 2006
vor 15 Jahren

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.

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren

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?

2.760 Beiträge seit 2006
vor 15 Jahren

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...

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren

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 😉

2.760 Beiträge seit 2006
vor 15 Jahren

Dann frag doch bei MS-Connect 😉