Autor Beitrag
ebber
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: Do 12.01.12 20:13 
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:

ausblenden volle Höhe 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()
        {
            // Screenshot machen
            System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(width, height);
            System.Drawing.Graphics gra = System.Drawing.Graphics.FromImage(bmp);
            gra.CopyFromScreen(0000, bmp.Size);
            gra.Dispose();

            int r = 0;
            int g = 0;
            int b = 0;

            // Alle Farben addieren
            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;
                }
            }

            // Und durch ihre anzahl teilen
            r = r / teiler;
            g = g / teiler;
            b = b / teiler;

            bmp.Dispose();

            // "Durchschnittsfarbe"
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 12.01.12 20:29 
Warum erzeugst du die Grafikobjekte jedesmal neu? :gruebel:

Zudem kannst du LockBits benutzen. Der pixelweise Zugriff über eine Funktion (die du zudem für rot usw. nochmal jedesmal einzeln aufrufst :shock:) ist logischerweise sehr viel langsamer.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 12.01.12 20:37 
Hallo ebber,

mit GetPixel hast du dir so ziemlich eine der langsamsten Sachen dafür ausgesucht.
Unter Bitmap-Manipulation (MemBitmap) sowie GetPixel und SetPixel um Längen geschlagen. 800 mal schneller gibt es zwei sehr effektive Verbesserungsmöglichkeiten.

Generell für Bildverarbeitung kann ich dir auch die LowLevelGraphicsLibrary empfehlen (ob die jetzt konkret "Ambient Light" unterstützt, weiß ich allerdings nicht).
ebber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: 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?