ImageList - Bitmap-Bits manipulieren



  • Hallo zusammen,

    ich möchte die Farbwerte einer ImageList-Bitmap manipulieren. Genauer gesagt möchte ich die Farbwerte "ausgrauen".

    In Kürze sieht der Ablauf wie folgt aus:

    // ImageList als DIBSECTION laden ...
    himl = ImageList_LoadImage (
    	g_hInstance, 
    	MAKEINTRESOURCE(IDB_MENU), 
    	16, 0, 
    	CLR_NONE, 
    	IMAGE_BITMAP, 
    	LR_CREATEDIBSECTION or LR_SHARED
    	)
    
    // ImageList duplizieren
    himlGrayed = ImageList_Duplicate (himl)
    
    // Bitmap-Handle der ImageList holen
    ImageList_GetImageInfo (himlGrayed, 0, &ii)
    	
    // Daten der Bitmap ermitteln
    GetObject (ii.hbmImage, sizeof(DIBSECTION), &dib)
    
    // Farbwerte manipulieren
    if (dib.dsBm.bmBits != NULL)
    	GrayScaleDIBits (dib.dsBm.bmBits, dib.dsBmih.biWidth, dib.dsBmih.biHeight)
    

    Gezeichnet wird dann mit folgenden Parametern:

    ImageList_DrawEx (
    	himlGrayed,
    	nIconIndex,
    	hDC,
    	x, y, 0, 0,
    	CLR_NONE,	CLR_NONE,
    	ILD_TRANSPARENT
    	)
    

    Das Problem ist nun, dass die Semi-Transparenten pixel nicht mehr Semitransparent sind, sondern von ImageList_DrawEx in weiss dargestellt werden.
    Der Algorythmus in der GrayScaleDIBits funktionieert aber definitiv.

    Denn wenn ich es auf nun folgende Art mache, dann ist alles so, wie es sein soll.

    // ImageList als DIBSECTION laden ...
    himl = ImageList_LoadImage (
    	g_hInstance, 
    	MAKEINTRESOURCE(IDB_MENU), 
    	16, 0, 
    	CLR_NONE, 
    	IMAGE_BITMAP, 
    	LR_CREATEDIBSECTION or LR_SHARED
    	)
    
    // ImageList duplizieren
    himlGrayed = ImageList_Duplicate (himl)
    
    // Alle Abbilder entfernen
    ImageList_Remove (himlGrayed, -1)
    
    // So funktioniert es ! Ist aber umständlicher und lansamer ...
    // ...
    // Abbild für Abbild aus der originalen Imagelist kopieren
    hbm = CreateDIBSection (hdcMem, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0)
    	
    hbmOld = SelectObject (hdcMem, hbm)
    
    ImageList_DrawEx (
    	himlSrc,
    	nIndex,
    	hdcMem,
    	0, 0, 0, 0,
    	CLR_DEFAULT, CLR_DEFAULT,
    	ILD_NORMAL
    	)
    
    GrayScaleDIBits (pvBits, cxImage, cyImage)
    
    SelectObject (hdcMem, hbmOld)
    nIndex = ImageList_Add (himlDest, hbm, NULL)
    
    DeleteObject (hbm)
    
    

    Ich habe absolut keine Ahnung, was an der ersten Methode falsch ist.
    Vielleicht weiß einer von euch Spezies ja was da nicht stimmt und wäre so nett mir auf die Sprünge zu helfen ...

    Vielen Dank fürs Lesen und viele Grüße
    Greenhorn



  • Hier mal das Ergebnis, Bilder sagen mehr als Worte ...

    Link

    • Methode 1: ImageList Bitmap-Bits direkt manipulieren
    • Methode 2: Umweg über CreateDIBSection und ImageList_Add


  • Das Einzige, was mir sonst noch dazu einfällt ist, dass die Farbwerte in der Bitmap der ImageList bereits prä-multipliziert sind.

    Gerde getestet und siehe da: Es funktioniert ! 😛 😍

    Also, zur Lösung:
    Wenn die Bitmap einer ImageList einen Alphakanal enthält, dann müssen die Farbwerte nach der Manipulation prä-multipliziert werden.


Log in to reply