Donnerstag, 8. April 2010

Feststellen der aktuellen Farbtiefe / Determine current color depth

Wer in seiner Applikation mit hochauflösenden Grafiken und Fotos arbeitet, der benötigt für eine einwandfreie Anzeige auch eine akzeptable Anzahl an darstellbaren Farben.

Früher war für viele solcher Anwendungen der Zugriff über Terminaldienste (Citrix, Terminalserver, u.ä.) oftmals ein K.O.-Kriterium, da in diesen Umgebungen aus Geschwindigkeitsgründen eine Farbtiefe von 8 Bit (=256 Farben) eingestellt war. Die aktuellen Versionen dieser Serverumgebungen unterstützen mittlerweile auch höhere Farbtiefen, denn um ein Foto in allen Details betrachten zu können sind 256 Farben definitiv nicht ausreichend.

Auch heute kommt es vor, dass Anwender (bspw. wegen Updates des Grafikkartentreibers) plötzlich wieder vor einer 8 oder 16 Bit Farbdarstellung sitzen, ohne dies überhaupt zu bemerken. Eine andere Möglichkeit ist, dass wir in unserer Applikation, je nach eingestellter Farbtiefe, andere Grafiken einblenden.

Der folgende Mustercode gibt uns Aufschluss über die aktuelle Farbtiefe, die verfügbaren Paletten und die darstellbare Anzahl an Farben die unserer Applikation zur Verfügung stehen.


CLEAR 
? [verfügbare Paletten: ]
??GetBitsPerPixel(1)
? [Farbtiefe in Bit   : ] 
??GetBitsPerPixel(2)
? [Anzahl Farben      : ]
??GetBitsPerPixel(3)

FUNCTION GetBitsPerPixel as Integer
LPARAMETERS vVersion as Integer
    * // Mögliche Parameterwerte:                            
    * // 1 = Verfügbare Paletten                                
    * // 2 = Farbtiefe in Bit                                   
    * // 3 = Anzeigbare Farben                                  
    
    * // Wenn kein Parameter übergeben wurde, dann mit        
    * // Defaultwert vorbesetzen...                            
    vVersion = EVL(vVersion,2)
    
    * // liBitsPerPixel beinhaltet die Farbtiefe            
    * // 8        = 8 Bit     = 256 Color                    
    * // 16       = 16 Bit    = High Color                    
    * // 24 / 32  = 24/32 Bit = TrueColor                    
    * // Es gibt noch weitere Wertmöglichkeiten, die o.a.    
    * // aufgezählten stellen jedoch die üblichen             
    * // Varianten dar.                                        
    
    * // Um die Farbtiefe festzustellen benötigen wir        
    * // mehrere API-Funktionen                                
    DECLARE INTEGER GetDC IN WIN32API AS GetDCHandle INTEGER hWnd
    DECLARE INTEGER GetActiveWindow IN WIN32API
    DECLARE INTEGER GetDeviceCaps IN WIN32API INTEGER hDC, INTEGER nIndex
    DECLARE INTEGER ReleaseDC IN WIN32API INTEGER hWnd, INTEGER hDC
    #DEFINE PLANES 14
    #DEFINE BITSPIXEL 12

    LOCAL liDChandle as Integer, liReturn as Integer
    
    * GetDeviceCaps Handle erzeugen + Returnwert vorbesetzen
    liDChandle    = GetDCHandle( GetActiveWindow() )
    liReturn    = 0
    
    DO CASE 
    CASE vVersion = 1
        * // Anzahl der verfügbaren Paletten feststellen 
        liReturn    = GetDeviceCaps( liDChandle , PLANES )
    CASE vVersion = 2
        * // Farbtiefe in Bits feststellen 
        liReturn    = GetDeviceCaps( liDChandle , BITSPIXEL )
    OTHERWISE 
        * // Anzahl darstellbarer Farben feststellen        
        * // Formel: 2 ^ (AnzahlPaletten * BitsProPixel)    
        liReturn    = INT( 2 ^ ( GetDeviceCaps( liDChandle , PLANES ) * GetDeviceCaps( liDChandle , BITSPIXEL ) ) )
    ENDCASE 
    
    * // GetDeviceCaps Handle freigeben                        
    =ReleaseDC( GetActiveWindow() , liDChandle )

    RETURN liReturn
    
ENDFUNC

Keine Kommentare:

Kommentar veröffentlichen