Helligkeit ändern



  • Hi @ All.

    ich möchte mit der WinApi die Helligkeit des Monitors veränder.
    aber ich möchte nicht, dass das der Monitor, sondern die Grakka regelt.

    Danke.



  • irgendwie geht das mit:
    SetDeviceGammaRamp(...)

    aber wie?
    thx.



  • sind deine " ich ärgere meine Kollegen Programme " schon fertig ?
    Wenn du weist wie die Funktion heist guck doch mal bei msdn nach vielleicht wirst du da schlau draus ( außerdem: es kommt immer gut wenn man vorher mal selber bei google ect. sucht bevor man das Forum zupostet ! )



  • hab ich gemacht..
    ich arbeite an einer gamma-klasse.
    aber irgendwie will das nicht so funzen, wie ich mir das dachte...
    ich möchte einen gammawert (float) von 0-1 setzen.
    wie geht das? SetGamma(float g)???

    danke. (PS: GetGamma(float *g)?? wäre auch nicht schlecht!!!
    oder das Bild zu verfärben.



  • Zeig mal deinen Code 😉



  • nu, ich hab ne gamma-klasse geschrieben.

    Gamma.h

    #include <windows.h>
    #include <math.h>
    
    #pragma once
    
    class CGamma
    {
    public:
    	CGamma(void);
    	~CGamma(void);
    	int RestoreGamma(void);
    	float GetGamma(void);
    	int SetGamma(float fGamma);
    private:
    	WORD RampDefault[3*256];
    	WORD RampNow[3*256];
    	float GammaDefault;
    	float GammaNow;
    };
    

    Gamma.cpp

    #include "Gamma.h"
    #include <windows.h>
    #include <math.h>
    
    CGamma::CGamma(void)
    {
    	HDC dc;
    	dc = GetDC(GetDesktopWindow());
    
    	if (!GetDeviceGammaRamp(dc,RampDefault))
    	{
    		CGamma::~CGamma();
    	}
    
    	// Get Gamma!!!
    	int i;
    	int m;
    	int min;
    	int max;
    	float sum[3];
    	float rgb[3];
    	for (i=0;i<3;i++)
    	{
    		min = i*256;
    		max = min+256;
    		for (m=min;m<max;m++)
    		{
    			if ((RampDefault[m] != 0) && (RampDefault[m] != 65535))
    			{
    				sum[i] += log((double)RampDefault[m]/(double)65535)/log((double)(m-min)/(double)256);
    			}
    		}
    		rgb[i] = sum[i]/256;
    	}
    	GammaDefault = (rgb[0]+rgb[1]+rgb[2])/3;
    
    	// Update Ramp
    	int b;
    	for (b=0;b<3*256;b++)
    	{
    		RampNow[b] = RampDefault[b];
    	}
    	GammaNow = GammaDefault;
    }
    
    CGamma::~CGamma(void)
    {
    	RestoreGamma();
    }
    
    int CGamma::RestoreGamma(void)
    {
    	HDC dc;
    	dc = GetDC(GetDesktopWindow());
    
    	if (!SetDeviceGammaRamp(dc,RampDefault))
    	{
    		return 1;
    	}
    	// Update Ramp
    	int b;
    	for (b=0;b<3*256;b++)
    	{
    		RampNow[b] = RampDefault[b];
    	}
    	GammaNow = GammaDefault;
    	return 0;
    }
    
    float CGamma::GetGamma(void)
    {
    	// Return gamma value
    	return (GammaNow-0.5)*2;
    }
    
    int CGamma::SetGamma(float fGamma)
    {
    	// First check wheather all is ok.
    	if ((fGamma < 0) || (fGamma > 1))
    	{
    		return 1;
    	}
    	fGamma = 0.5 + fGamma*0.5;
    
    	// Make backup :)
    	WORD RampBackup[3*256];
    	int b;
    	for (b=0;b<256;b++)
    	{
    		RampBackup[b] = RampNow[b];
    	}
    
    	// Then make ramps
    	int i;
    	for (i=0;i<256;i++)
    	{
    		RampNow[i] = (WORD)((float)i/(float)255*(float)65535*(float)fGamma);
    		if (RampNow[i] < 0)
    		{
    			RampNow[i] = 0;
    		}
    		if (RampNow[i] > 65535)
    		{
    			RampNow[i] = 65535;
    		}
    		RampNow[i+256] = RampNow[i+512] = RampNow[i];
    	}
    
    	// Get Device
    	HDC dc;
    	dc = GetDC(GetDesktopWindow());
    
    	// Set it
    	if (!SetDeviceGammaRamp(dc,RampNow))
    	{
    		// Restore backup :(
    		int b;
    		for (b=0;b<256;b++)
    		{
    			RampNow[b] = RampBackup[b];
    		}
    		return 1;
    	}
    
    	// Update gamma
    	GammaNow = fGamma;
    
    	return 0;
    }
    

    Nun mann kann die so benutzen.

    #include "Gamma.h"
    
    CGamma *Gamma = new CGamma();
    
    // Nun kann ich die Helligkeit von 0 - 1 ändern.
    // Null ist aber nicht wirklich schwarz...
    Gamma->SetGamma(0.5);
    // und dann kann ich das ausgeben lassen.
    cout << "Gamma: ";
    cout << Gamma->GetGamma();
    


  • So!

    hier habe ich mal mein genialen Farbveränderer!

    der ist total cool ...

    nun hat meine Gamma klasse noch etwas mehr zu bieten:
    RGB separat angeben
    von 0-2. 1 == standard , 0 dunkelste, 2 hellste.
    toll ne?



  • toll



  • Ich find deine Begeisterung echt super, aber nicht unbedingt mitteilenswürdig...

    Mfg ominion



  • Warum die meisten Leute ihre Objekte immer sinnlos mit new anlegen...hm irgendwann werd ich das auchmal verstehen 😕 .



  • CodeFinder schrieb:

    Warum die meisten Leute ihre Objekte immer sinnlos mit new anlegen...hm irgendwann werd ich das auchmal verstehen 😕 .

    Da kann ich dir weiterhelfen: der Grund ist weil sie doof sind.



  • hustbaer schrieb:

    CodeFinder schrieb:

    Warum die meisten Leute ihre Objekte immer sinnlos mit new anlegen...hm irgendwann werd ich das auchmal verstehen 😕 .

    Da kann ich dir weiterhelfen: der Grund ist weil sie doof sind.

    Scharfsinnig 🕶 , yep, so ist's wohl 😉 .



  • hustbaer schrieb:

    CodeFinder schrieb:

    Warum die meisten Leute ihre Objekte immer sinnlos mit new anlegen...hm irgendwann werd ich das auchmal verstehen 😕 .

    Da kann ich dir weiterhelfen: der Grund ist weil sie doof sind.

    Falsch sie haben vorher in Java geproggt.



  • Wie soll ich das Objekt denn sonst anlegen?????



  • CGamma Gamma;
    


  • Außerdem ist es meiner Meinung nach gefährlicher mit new Objekte anzulegen, da es nur einen Zeiger auf dieses Objekt zurückgibt, aber keinen richtigen Namen, wenn man CGamma Gamma; schreibt, dann ist Gamma CGamme, aber wenn man das mit new macht, und dann aus versehen den Zeiger auf ein Anderes Objekt zeigen lässt, dann ist Speicher futsch!

    Gruß Chris



  • Also meiner kompetenten meinung nach(aha!) ist es auch ganz toll ein objekt mit new anzulegen! Der -> operator sieht einfach schöner aus und verdeutlicht, dass es ganz toll ist. So ein paarhundertfachen erstellungsgeschwindigkeitsverlust kann man ja einmal hinnehmen ist ja nich die welt!



  • Ja ja! ich bin böld.
    aha, weiß man ja net, wenn mans net gesagt bekommt.
    aber von nu werd icn das drechs new weglassen.
    thx.



  • Naja so böse wars ja nicht gemeint...
    Aber es ist wirklich besser außer eben du hast etwas, was du wirklich außerhalb einer funktion hast, oder erst im verlauf eines konstruktors initialisieren kann.



  • Naja, es gibt auch leute die C++ im Stil "viel new ist viel OO" unterrichten.
    Was natürlich doof ist. Jemand der "viel new" mag sollte Java und nicht C++ verwenden.

    Und tragisch ist es auch, solche Leute sollten nicht unterrichten... aber naja. He who can, does. He who cannot, teaches. 😃



  • Hallo,

    auch wenn der Thread schon etwas aelter ist: Erst mal vielen Dank fuer das Beispiel. Ich habe allerdings noch eine Frage. Der Code compiliert im VS 2005 Express ohne Probleme. Ich wollte die CGamma Klasse aber auch in einem kleinen QT Programm verwenden. Dazu hab ich mir den QTCreator installiert. Wenn ich den gleiche Code mit dem QtCreator compiliere, bekomme ich immer den Fehler:

    Gamma.cpp:17: error: no matching function for call to `CGamma::CGamma()
    Gamma.cpp:6: note: candidates are: CGamma::~CGamma()

    Er scheint den Destruktor zwar zu finden (weil er ja sagt, es gebe einen KAndidaten) aber scheinbar nicht anzuerkennen?!?!
    Hab in meinem C++ Buch und im Internet gesucht, finde aber keinen Grund warums nicht funktionieren sollte. Hat jemand ne Idee?

    Gruss

    Sebastian


Anmelden zum Antworten