Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farbe von Bildschirminhalt ermitteln ? (https://www.delphipraxis.net/136507-farbe-von-bildschirminhalt-ermitteln.html)

Medium 2. Jul 2009 17:34

Re: Farbe von Bildschirminhalt ermitteln ?
 
RGB wird unter Windows meist in der Reihenfolge BGR gespeichert. Du kommst ohne Konvertierungen aus, wenn du statt TColor TColor32 nimmst, und statt Get*Value die Funktionen RedComponent usw. der G32 nimmst. Die G32 ist in der Tat mit das schnellste beim Pixelzugriff. Bist du sicher, dass die Screenshotfunktion nicht der Engpass ist?
Ich würde mir da lieber den DC vom Desktop abholen (GetDC(0)), und aus diesem auch wirklich immer nur die Stücke die ich brauche in ein passend großes Bitmap werfen. Das spart eine Menge Pixel aus der Mitte, und ist je nach dem wie die Screenshot-Funktion arbeitet auch von sich aus schon schneller.
Letztlich musst du aber auch sehen, dass es durchaus einige Arbeit ist diese Menge an Pixeln durchzuackern. Alle 25ms ist das ne ganz schön happige Angelegenheit.

Blamaster 2. Jul 2009 18:59

Re: Farbe von Bildschirminhalt ermitteln ?
 
Hi,

das hier ist die Screenshot Funktion:

Delphi-Quellcode:
function FormularScreenShot(Bmp: TBitmap32; h: hWnd): Boolean;
var
  Rec: TRect;
  iWidth, iHeight: Integer;
begin
  with Bmp do try
    GetWindowRect(h, Rec);

    iWidth := Rec.Right - Rec.Left;
    iHeight := Rec.Bottom - Rec.Top;

    Width := iWidth;
    Height := iHeight;

    BitBlt(Canvas.Handle, 0, 0, iWidth, iHeight, GetWindowDC(h), 0, 0, SRCCOPY);

    Result := True;
  finally
    ReleaseDC(h, GetWindowDC(h));
  end;
end;
Kann es daran liegen ?

Wenn es an der nicht liegt gibt es dann noch eine andere möglichkeit das ganze zu relisieren ? Denn um das Atomlight vernünftig wirken zu lassen, sollte schon alle 25ms ein scan erfolgen.

mfg Yannic

Apollonius 2. Jul 2009 19:02

Re: Farbe von Bildschirminhalt ermitteln ?
 
Eine wahrlich interessante Vorstellung zum Freigegeben von Gerätekontexten...

Mithrandir 2. Jul 2009 19:10

Re: Farbe von Bildschirminhalt ermitteln ?
 
Wie genau soll das Ambilight denn später arbeiten? Hast du dir schon Gedanken um die Hardware gemacht?

Blamaster 2. Jul 2009 19:35

Re: Farbe von Bildschirminhalt ermitteln ?
 
Hi,

den code für den Screenshot habe ich nicht selber entworfen sonder nfertig übernommen. Ob das nun eine gute oder schlechte Lösung ist kann ich mit meiner Kenntnis momentan nicht sagen.

Die Hardware für das Ambilight steht schon. Das Programm übergibt die RGB Werte über die Rs232 Schnitstelle an einen Microcontroller, dieser setzt dann die Farben.

mfg Yannic

Mithrandir 2. Jul 2009 19:44

Re: Farbe von Bildschirminhalt ermitteln ?
 
Nö, nicht unbedingt. Wenn deine Idee dazu steht, und die HW funktioniert, ist es ja ok. Was Apollonius mit seinem Post sagen wollte, habe ich allerdings nicht so ganz verstanden...

Btw, ich halte 25ms für übertrieben. 4 mal die Sekunde (alle 250 ms) sollte imho reichen.

Blamaster 2. Jul 2009 20:01

Re: Farbe von Bildschirminhalt ermitteln ?
 
Hi,

ich habe nun nochmal einen Direktvergleich gemacht.

1.) Einmal das ganze mit tbitmap, tcolor und Bitmap.Canvas.Pixels[x,y];
2.) Dann das ganze mit tbitmap32, tcolor32 und Bitmap.Pixel[x,y];

Der rest ist identisch bei einer Timer Zeit von 250ms habe ich bei Variante 1 eine Cpu Last von 11%, bei Variante 2 eine Cpu Last von 55% wie kann da sein ?

mfg Yannic

Blamaster 2. Jul 2009 22:47

Re: Farbe von Bildschirminhalt ermitteln ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe jetzt nochmal ein kleines Programm geschrieben, welches das Problem verdeutlicht und den Code für das ambilight enthält.

Ich kann da definitiv zwischen der gr32 Methode und der normalen keine Verbesserung feststellen.

mfg Yannic

Reinhard Kern 2. Jul 2009 22:49

Re: Farbe von Bildschirminhalt ermitteln ?
 
Zitat:

Zitat von Blamaster
Hi,

der Code funktioniert jetzt soweit.
...

Hallo,

da steckt meiner Ansicht nach ein massiver Denkfehler drin: du berechnest das Vorkommen der R, G und B-Werte getrennt, aber das hat praktisch keine Aussagekraft über Farben. Ein Grünwert von 128 kann in vielen verschiedenen Farben vorkommen (um genau zu sein, in 65536). Nur zusammen definieren RGB eine Farbe, und die Farbe ist nun mal ein 24-Bit-Wert. Da kann man sich nicht drum herum tricksen, indem man 3 x 8-Bit-Werte getrennt verarbeitet. Genausogut könnte man die Häufigkeit von Buchstaben bestimmen wollen, indem man die beiden 4bit-Nibbel getrennt zählt, weil man dann nur 32 Zähler braucht anstatt 256 - tolle Einsparung, aber was sagt das Ergebnis über die Buchstabenverteilung aus? Die Ergebnisse sind also ohne jeden Wert.

Erfahrungsgemäss wird dieser Einwand völlig ignoriert, weil die Erkenntnis unangenehm wäre.

Gruss Reinhard

Blamaster 3. Jul 2009 08:56

Re: Farbe von Bildschirminhalt ermitteln ?
 
@ Reinhard Kern

von der Seite habe ich das noch garnicht betrachtet.

Allerdings möchte ich mich erstmal nicht um die Ausbesserung davon kümmern sondern das Programm überhaupt zum "schnellen" laufen bekommen.

mfg Yannic


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.
Seite 2 von 4     12 34      

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