AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Farbe von Bildschirminhalt ermitteln ?
Thema durchsuchen
Ansicht
Themen-Optionen

Farbe von Bildschirminhalt ermitteln ?

Ein Thema von Blamaster · begonnen am 2. Jul 2009 · letzter Beitrag vom 19. Jul 2009
Antwort Antwort
Seite 2 von 4     12 34      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 2. Jul 2009, 18:34
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#12

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 2. Jul 2009, 19:59
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 2. Jul 2009, 20:02
Eine wahrlich interessante Vorstellung zum Freigegeben von Gerätekontexten...
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#14

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 2. Jul 2009, 20:10
Wie genau soll das Ambilight denn später arbeiten? Hast du dir schon Gedanken um die Hardware gemacht?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#15

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 2. Jul 2009, 20:35
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
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#16

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 2. Jul 2009, 20:44
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.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#17

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 2. Jul 2009, 21:01
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
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#18

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 2. Jul 2009, 23:47
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
Angehängte Dateien
Dateityp: rar ambilight_test_756.rar (269,6 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#19

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 2. Jul 2009, 23:49
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
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#20

Re: Farbe von Bildschirminhalt ermitteln ?

  Alt 3. Jul 2009, 09:56
@ 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 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