【问题标题】:How to programmatically detect if a bitmap has alpha channel?如何以编程方式检测位图是否具有 Alpha 通道?
【发布时间】:2010-10-15 16:49:56
【问题描述】:

作为主题。最好使用 C 代码。

【问题讨论】:

    标签: bitmap alpha


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用 #333559 中所述的 ::GetDIBits

      【讨论】:

        【解决方案3】:

        关于那个答案,不清楚如何处理 GetDiBits():

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

        bits[3] == 左上角像素的 alpha;

        应该对位[3] 进行零测试吗?如何处理该值?谢谢,

        【讨论】:

        • 如果你使用 bits[3],它可能是带有 BGR[B]GR 的 24 位位图,所以你会得到 Blue 值,而不是 alpha。
        【解决方案4】:

        我已经实现了一个原型,但它不能正常工作,所以代码中可能有问题。我在这里分享它,希望我们可以一起修复它:

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

        谢谢!

        【讨论】:

          【解决方案5】:

          使用 GetDIBits(hdc, hbmp, 0, 1, NULL, &bmi, DIB_RGB_COLORS)

          然后看看bmi.bmiHeader.biBitCount的值是否为32那么它有alpha通道,否则它没有alpha。

          【讨论】:

            猜你喜欢
            • 2012-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-30
            • 1970-01-01
            • 1970-01-01
            • 2014-08-24
            • 1970-01-01
            相关资源
            最近更新 更多