Как программно определить, есть ли у растрового изображения альфа-канал? - PullRequest
2 голосов
/ 26 марта 2009

как предмет. Предпочтительно использовать код С.

Ответы [ 5 ]

3 голосов
/ 22 августа 2010

========= Версия 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;
    }
1 голос
/ 26 марта 2009

На этот ответ не ясно, что делать с GetDiBits ():

GetDIBits (hDC, hBmp, 0, 1, (void **) и биты, & bmi, DIB_RGB_COLORS);

бит [3] == альфа верхнего пикселя;

Должны ли биты [3] быть проверены на ноль? что делать с этим значением? спасибо,

1 голос
/ 28 марта 2009

Я реализовал прототип, но он не работает нормально, поэтому в коде может быть что-то не так. Я делюсь этим здесь с надеждой, что мы сможем исправить это вместе:

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

Спасибо! * * 1004

1 голос
/ 26 марта 2009

С :: GetDIBits, как описано в # 333559

0 голосов
/ 03 января 2016

Использовать GetDIBits (hdc, hbmp, 0, 1, NULL, & bmi, DIB_RGB_COLORS) .

А затем посмотрите, если bmi.bmiHeader.biBitCount имеет значение 32 , тогда у него есть альфа-канал, в противном случае у него нет альфы.

...