2009-03-26 6 views

Répondre

1

Sur cette réponse on ne sait pas quoi faire avec GetDIBits():

GetDIBits (hdc, hBmp, 0, 1, (void **) & bits, & bmi, DIB_RGB_COLORS);

bits [3] == alpha du pixel supérieur;

Les bits [3] doivent-ils être testés contre zéro? que faire avec cette valeur? merci,

+0

Si vous utilisez des bits [3], il s'agit probablement d'un bitmap 24 bits avec BGR [B] GR, donc vous obtiendrez une valeur bleue, pas alpha. – dns

1

J'ai implémenté un prototype mais ça ne fonctionne pas bien, donc il y a peut-être quelque chose qui ne va pas dans le code. Je partage ici avec l'espoir que nous pouvons le réparer ensemble:

BOOL HasAlphaChannel(HBITMAP hBmp) 
{ 
    HDC hDC = CreateCompatibleDC(NULL); 
    BITMAPINFO bmi; 
    void * bits; 
    unsigned long ul; 
    BOOL bAlphaChannel = FALSE; 

    memset(&bmi, 0, sizeof(BITMAPINFO)); 
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 

    GetDIBits(hDC, hBmp, 0, 1, NULL, &bmi, DIB_RGB_COLORS); 

    bits = malloc(bmi.bmiHeader.biSizeImage); 

    // this is returning zero wich means error (why???) 
    GetDIBits(hDC, hBmp, 0, bmi.bmiHeader.biHeight, &bits, &bmi, DIB_RGB_COLORS); 

    for(ul = 0; ul < bmi.bmiHeader.biSizeImage; ul += 4) 
     if(((char *) bits)[ ul + 3 ] != 0) 
     bAlphaChannel = TRUE;  

    free(bits); 

    DeleteDC(hDC); 

    return bAlphaChannel; 
} 

Merci!

3

========= MFC++ version

private: static Boolean __gc* BitmapHasAlpha(BitmapData __gc* bmpData) 
{ 
    if ((bmpData->PixelFormat != PixelFormat::Format32bppArgb) && (bmpData->PixelFormat != PixelFormat::Format32bppRgb)) 
    { 
     return false; 
    } 
    for (Int32 __gc* i = 0; (i < bmpData->Height); i++) 
    { 
     Int32 __gc* num2 = (i * bmpData->Stride); 
     for (Int32 __gc* j = 3; (j < (bmpData->Width * 4)); j += 4) 
     { 
      Byte __gc** numPtr = *static_cast<__box Byte __gc***>(((bmpData->Scan0->ToPointer() + num2) + j)); 
      if (numPtr[0] != 0) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

========= C# Version

private static unsafe bool BitmapHasAlpha(BitmapData bmpData) 
    { 
     if ((bmpData.PixelFormat != PixelFormat.Format32bppArgb) && (bmpData.PixelFormat != PixelFormat.Format32bppRgb)) 
     { 
      return false; 
     } 
     for (int i = 0; i < bmpData.Height; i++) 
     { 
      int num2 = i * bmpData.Stride; 
      for (int j = 3; j < (bmpData.Width * 4); j += 4) 
      { 
       byte* numPtr = ((byte*)bmpData.Scan0.ToPointer()) + num2 + j; 
       if (numPtr[0] != 0) 
       { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
0

Utilisez GetDIBits (hdc, hbmp, 0, 1, NULL, & bmi, DIB_RGB_COLORS).

Et puis voir si bmi.bmiHeader.biBitCount a une valeur de 32 alors il a canal alpha, sinon il n'a pas alpha.

Questions connexes