Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi GetPixel unter Vista (https://www.delphipraxis.net/97267-getpixel-unter-vista.html)

meg91 7. Aug 2007 21:38


GetPixel unter Vista
 
Hi@all
ich hatte mal vor längerer Zeit eine Funktion geschrieben, die über GetPixel die Durchschnittsfarbe einer ausgewählten Fläche am Bildschirm errechnet. Dazu habe ich einfach die Farben einiger Pixels geholt, alle zusammengezählt und dann wieder durch die Pixelanzahl geteilt, eigentlich ziemlich simpel.
Auf 2000 und XP hat das alles super funktioniert, nur unter Vista will das ganze nicht so recht
Sobald ich versuche die Pixels zu "scannen" reagiert das Programm nicht mehr

gibt es unter Vista dafür einen eigenen Befehl?
was läuft da falsch?

Gruß
Markus

Flare 7. Aug 2007 23:14

Re: GetPixel unter Vista
 
Du könntest uns deinen bisher verwendeten Code mal zeigen. Das würde die Sache auf jeden Fall leichter machen.


Flare

meg91 8. Aug 2007 00:01

Re: GetPixel unter Vista
 
so sieht meine Prozedur aus
Delphi-Quellcode:
procedure AreaToPix;
var
  Handle: THandle;
  yFor, xFor: Integer;
  bRed, bGreen, bBlue: Byte;
  PixelColor: Integer;
  bXgesRed, bXgesGreen, bXgesBlue: Integer; //Duchschnittsfarben Horizontal
  bYgesRed, bYgesGreen, bYgesBlue: Integer; //Duchschnittsfarben Vertikal
begin
  Handle := GetDC(0);
  try
    bXgesBlue := 0;
    bXgesGreen := 0;
    bXgesRed := 0;

    for yFor := 1 to 9 do
    begin
      bYgesBlue := 0;
      bYgesGreen := 0;
      bYgesRed := 0;

      for xFor := 1 to 7 do
      begin
        PixelColor := GetPixel(Handle, round(yFor * ((x2-x1)/9)) + x1, round(xFor * ((y2-y1)/7)) + y1);
        bBlue := PixelColor;
        bGreen := PixelColor shr 8;
        bRed := PixelColor shr 16;

        bYgesBlue := bYgesBlue + bBlue;
        bYgesGreen := bYgesGreen + bGreen;
        bYgesRed := bYgesRed + bRed;
      end;

      bYgesBlue := Round(bYgesBlue / 7);
      bYgesGreen := Round(bYgesGreen / 7);
      bYgesRed := Round(bYgesRed / 7);

      bXgesBlue := bXgesBlue + bYgesBlue;
      bXgesGreen := bXgesGreen + bYgesGreen;
      bXgesRed := bXgesRed + bYgesRed;
    end;

    bXgesBlue := Round(bXgesBlue / 9);
    bXgesGreen := Round(bXgesGreen / 9);
    bXgesRed := Round(bXgesRed / 9);

    //Werte ausgeben
    u_usbpwm.Form1.changeLEDs(bXgesRed, bXgesGreen, bXgesBlue);
  finally
    ReleaseDC(0, Handle);
  end;
end;

xaromz 8. Aug 2007 09:01

Re: GetPixel unter Vista
 
Hallo,

bei mir funktioniert diese Routine genau so, wie sie soll. Das Problem ist aber, dass Du auf den DC des Desktops zugreifst. Das sollte man unter Vista vermeiden, da es sehr lang dauert.

Gruß
xaromz

Dezipaitor 8. Aug 2007 12:59

Re: GetPixel unter Vista
 
von VNC weiß ich, dass man den Desktop (oder den gewünschten Bereich) erstmal in ein Speicherbitmap kopieren sollte, um ihn dann weiter analysieren zu können.

meg91 8. Aug 2007 16:54

Re: GetPixel unter Vista
 
bin ich noch gar nicht drauf gekommen,
aber bracht es nicht ein haufen Speicher wenn ich den ganzen Desktop "zwischenspeichere"
außerdem soll diese Prozdur ca 100-250 mal pro Sekunde durchlaufen
wird das ganze dann nicht viel zu langsam?

Dezipaitor 8. Aug 2007 17:19

Re: GetPixel unter Vista
 
Zitat:

Zitat von meg91
bin ich noch gar nicht drauf gekommen,
aber bracht es nicht ein haufen Speicher wenn ich den ganzen Desktop "zwischenspeichere"
außerdem soll diese Prozdur ca 100-250 mal pro Sekunde durchlaufen
wird das ganze dann nicht viel zu langsam?

Natürlich belastet das den PC. Das musst du auch ausprobieren. Aber soviel wird es auf heutigen Rechnern nicht sein. VNC macht es ja auch so (nur optimiert).
Der Speicher von 1600x1200 bleibt unterhalb von 10mb.

Am schnellsten würde es funktionieren, wenn du wie UltraVNC einen Hook verwendest, der nur die Änderungen auf dem Bildschirm dir mitteilt.
Schau dir doch die Quellen von UltraVNC mal an.

meg91 8. Aug 2007 21:56

Re: GetPixel unter Vista
 
ich habe mir die ganzen Sachen angeschaut, aber ganz ehrlich ich blick da nicht durch
zu der Sache mit dem Bitmap:
da gibt es schon einige Routinen, welche aber alle den DC verwenden und somit wohl auch nicht schneller sein werden

mir ist jetzt auch aufgefallen, dass die DC Geschichte auf Vista nur schrecklich langsam ist, wenn man nämlich 100 Anfragen pro Sek sendet, siehts eben so aus, als ob gar nix mehr ginge :?

das mit der Systemauslastung ist mir schon bewusst. Ich hatte auf meinem alten PC (AMD 2,6GHz_WinXP) eine CPU-Auslastung von ca 45% bei 250 Anfragen/s, da dachte ich eigentlich dass es auf nem Intel 2,2 Core2Duo (aber mit Vista) doch etwas schneller geht und nicht langsamer

vllt könntet ihr mal ein CodeSchnipsel posten, mit einer Alternative zu DC, oder die Hook Sache fände ich auch spannend, wobei ich eigentlich für meine Zwecke keinen Nutzen darin sehe nur die Veränderten Bereiche auszulesen, da ich für die Druchschnittsfarbe doch alle brauche

meg91 15. Aug 2007 09:46

Re: GetPixel unter Vista
 
hab niemand ne Idee wie das unter Vista läuft ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz