【发布时间】:2010-10-15 16:49:56
【问题描述】:
作为主题。最好使用 C 代码。
【问题讨论】:
作为主题。最好使用 C 代码。
【问题讨论】:
=========MFC++版本
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#版本
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;
}
【讨论】:
使用 #333559 中所述的 ::GetDIBits
【讨论】:
关于那个答案,不清楚如何处理 GetDiBits():
GetDIBits(hDC, hBmp, 0, 1, (void**) &bits, &bmi, DIB_RGB_COLORS );
bits[3] == 左上角像素的 alpha;
应该对位[3] 进行零测试吗?如何处理该值?谢谢,
【讨论】:
我已经实现了一个原型,但它不能正常工作,所以代码中可能有问题。我在这里分享它,希望我们可以一起修复它:
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;
}
谢谢!
【讨论】:
使用 GetDIBits(hdc, hbmp, 0, 1, NULL, &bmi, DIB_RGB_COLORS)。
然后看看bmi.bmiHeader.biBitCount的值是否为32那么它有alpha通道,否则它没有alpha。
【讨论】: