Entwickler-Ecke
Multimedia / Grafik - Ambient Backlight
ebber - Do 12.01.12 20:13
Titel: Ambient Backlight
Hallo,
ich glaube man nennt es ambient backlight? Das was manche Fernseher haben, was den Raum in der "Durschnittsfarbe" des Bildes beleuchtet. Ich wollte mir sowas auch bauen, für den Computer.
Nun brauche ich aber die "Durschnittsfarbe" des Bildschirms. Ich habe theoretisch auch die Lösung:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| public Color ScreenshotT() { System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(width, height); System.Drawing.Graphics gra = System.Drawing.Graphics.FromImage(bmp); gra.CopyFromScreen(0, 0, 0, 0, bmp.Size); gra.Dispose();
int r = 0; int g = 0; int b = 0;
for (int i = 0; i < height; i = i + 10) { for (int a = 0; a < width; a = a + 10) { r += bmp.GetPixel(a, i).R; g += bmp.GetPixel(a, i).G; b += bmp.GetPixel(a, i).B; } }
r = r / teiler; g = g / teiler; b = b / teiler;
bmp.Dispose();
return Color.FromArgb(255, Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b)); } |
Allerdings ist es ein wenig langsam. Wenn ich jedes Pixel aufsummiere, dauert das ganze 4sek. So wie hier, bei nur jedem 100sten Pixel, dauert das Ganze ca. 200ms, was immernoch sehr langsam ist. (i7 @ 4,4Ghz)
Den Screenshot machen an sich, dauert schon 50ms. Eigentlich sollte das Ganze nur maximal so lange dauern.
Hat jemand eine Idee, wie man die Sache beschleunigen könnte?
MfG
jaenicke - Do 12.01.12 20:29
Warum erzeugst du die Grafikobjekte jedesmal neu? :gruebel:
Zudem kannst du
LockBits [
http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx] benutzen. Der pixelweise Zugriff über eine Funktion (die du zudem für rot usw. nochmal jedesmal einzeln aufrufst :shock:) ist logischerweise sehr viel langsamer.
ebber - Fr 13.01.12 15:07
Danke.
Ich habe die Objekte auch mal nicht immer neu erzeugt, hat aber keine merkbare Verbesserung gebracht.
Hilft mir LockBits? Ist das nicht ehr zum bearbeiten gedacht?
Aufjedenfall tritt auch bei den anderen extra Bitmap Klassen, wie die "MemBitmap" oder das "800mal schnellere", ein anderes Problem auf. Sie sind dann bei GetPixel schneller, aber sie brauchen bedeutend mehr Zeit bis sie erstellt sind, sodass sie auch keine Verbesserung gebracht haben.
Die LowLevelGraphicsLibrary habe ich nicht probiert, gut zu wissen, dass es das gibt, aber wohl ein wenig oversized?
Nachdem ihr gesagt habt, dass GetPixel langsam ist, habe ich sie nur noch 1 mal aufgerufen und nicht mehr 3 mal. Das hat am meisten gebracht.
Optimal ist es immer noch nicht. Das Problem scheint mir aber hauptsächlich noch am Screenshot machen zu liegen. Hat da jemand eine Idee wie man das beschleunigen könnte?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!