2009-03-26 11 views

Antwort

1

Auf dieser Antwort ist es nicht klar, was mit GetDIBits zu tun():

GetDIBits (hDC, HBMP, 0, 1, (void **) & Bits, & bmi, DIB_RGB_COLORS);

Bits [3] == Alpha des oberen Bildelements;

Sollten Bits [3] gegen Null getestet werden? was mit diesem Wert zu tun? Danke,

+0

Wenn Sie Bits [3] verwenden, ist es wahrscheinlich 24-bit Bitmap mit BGR [B] GR, so dass Sie Blue-Wert, nicht Alpha erhalten. – dns

1

Ich habe einen Prototyp implementiert, aber es funktioniert nicht gut, so kann es etwas falsch im Code sein. Ich teile es hier mit der Hoffnung, dass wir es zusammen beheben können:

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; 
} 

Vielen Dank!

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

Verwenden GetDIBits (hdc, hBMP, 0, 1, NULL, & bmi, DIB_RGB_COLORS).

Und dann sehen, ob bmi.bmiHeader.biBitCount Wert von hat dann Alphakanal hat, sonst ist es nicht alpha hat.

Verwandte Themen