Laden...

pixelColor Abfrage beschleunigen?

Erstellt von mrleem22 vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.228 Views
M
mrleem22 Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren
pixelColor Abfrage beschleunigen?

Guten Tag,

mein Programm soll auf meinem Desktop an bestimmten x,y Koordinaten die Pixelfarbe auslesen.
So sieht mein jetziger code aus:


foundColorToVar(getPixelColor(0, 0));


private Color GetColorAt(int x, int y)
        {
            IntPtr desk = GetDesktopWindow();
            IntPtr dc = GetWindowDC(desk);
            int a = (int)GetPixel(dc, x, y);
            ReleaseDC(desk, dc);
            return Color.FromArgb(255, (a >> 0) & 0xff, (a >> 8) & 0xff, (a >> 16) & 0xff);
        }


        private int getPixelColor(int x, int y)
        {
            Color color1 = GetColorAt(x, y);

            int r = color1.R;
            int g = color1.G;
            int b = color1.B;

            int pixelColor = int.Parse(r.ToString() + g.ToString() + b.ToString());

            return pixelColor;
        }

Würde gerne wissen ob es eine schnellere Variante als die von mir gefundene gibt.
Ein Durchlauf für 20 Pixel dauert ~300ms. Dauert mir leider etwas zu lange.
Ist es möglich diesen Vorgang noch zu beschleunigen?

Danke und Grüße

6.911 Beiträge seit 2009
vor 8 Jahren

Hallo mrleem22,

schau dir mal GetPixel und SetPixel um Längen geschlagen. 800 mal schneller an. Ggf. musst du das ein wenig anpassen, aber das zeigt die Richtung wie es schneller geht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
mrleem22 Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

Danke für den Link. Abfrage läuft nun schnell genug.

M
mrleem22 Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

Die Pixel werden nun schnell genug vom davor erstellten Bitmap abgefragt.
Leider ist mir die CopyFromScreen methode noch nicht performant genug. Gibt es da noch eine andere Lösung ohne leichten "Lag" beim Ausführen dieser Methode im ~50ms Takt außer auf directx zurückzugreifen zu müssen?

GFX.CopyFromScreen(rectPxl.X, rectPxl1.Y, 0, 0, rectPxl.Size,CopyPixelOperation.SourceCopy);

Habe lange gesucht und konnte nur die Lösung DirektX finden.

edit:
Ich erkläre vielleicht erst mal was mein Ziel ist.
Möchte an mehreren Positionen vom Desktop je einige Pixel auf Farbe prüfen lassen und diese in ein Array schreiben.
Die Positionen an welchen sich die Pixel befinden ist bekannt, deshalb erstelle ich nur ein Bitmap des Bereichs in welchen sich die Pixel befinden per rectangle.

Danke und Grüße
mrleem22