C++ 完全透明图像

C++ 完全透明图像,c++,windows,bitmap,gdi,C++,Windows,Bitmap,Gdi,有谁知道我如何创建一个完全透明的图像或给定的am图像(HBITMAP)我如何完全擦除它,使其中的所有像素都是100%透明的 谢谢。位图需要是32位的,因此它有一个alpha通道,您可以使用该通道设置不透明度值。如果图像不是32位的,则必须创建一个新的32位位图,并将原始像素复制到其中。位图需要是32位的,因此它有一个alpha通道,您可以使用该通道设置不透明度值。如果图像不是32位的,则必须创建一个新的32位位图并将原始像素复制到其中。可以使用单色位图作为遮罩,从彩色位图创建透明图像。这相当复杂

有谁知道我如何创建一个完全透明的图像或给定的am图像(
HBITMAP
)我如何完全擦除它,使其中的所有像素都是100%透明的


谢谢。

位图需要是32位的,因此它有一个alpha通道,您可以使用该通道设置不透明度值。如果图像不是32位的,则必须创建一个新的32位位图,并将原始像素复制到其中。

位图需要是32位的,因此它有一个alpha通道,您可以使用该通道设置不透明度值。如果图像不是32位的,则必须创建一个新的32位位图并将原始像素复制到其中。

可以使用单色位图作为遮罩,从彩色位图创建透明图像。这相当复杂。参见示例(在VB中,但直接使用Win32 API)


或者,该函数可能会使您尝试执行的操作变得不必要。

您可以使用单色位图作为遮罩,从彩色位图创建透明图像。这相当复杂。参见示例(在VB中,但直接使用Win32 API)


或者,该函数可能会使您尝试执行的操作变得不必要。

我在GDI+中找到了答案。最好的方法是附加您正在使用GDI+图形对象的图像的设备上下文,然后调用其清除方法。

我在GDI+中找到了答案。实现这一点的最佳方法是附加您正在使用GDI+图形对象的图像的设备上下文,然后调用其清除方法。

我还找到了不使用GDI+的解决方案

BITMAPV5HEADER bi = {sizeof(BITMAPV5HEADER), 320, 240, 1, 32, BI_BITFIELDS, 0, 0, 0, 0, 0, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000};
HDC hDc = ::CreateCompatibleDC(0);

if(NULL != hDc)
{
    RGBQUAD* pArgb;
    HBITMAP tBmp = ::CreateDIBSection(hDc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&pArgb, NULL, 0);

    if(NULL != tBmp)
    {
        int x, y;
        DWORD pBits;

        pBits = (DWORD*)pArgb;
        for(y = 0; y < bi.bV5Height; y++)
        {
            for(x = 0; x < bi.bV5Width; x++)
            {
                *pBits = 0;
                pBits++;
            }
        }
    }
    ::DeleteObject(hDc);
}
BITMAPV5HEADER bi={sizeof(BITMAPV5HEADER),320,240,1,32,bi_位字段,0,0,0,0,0x00FF0000,0x0000FF00,0x000000FF,0xFF000000};
HDC HDC=::CreateCompatibleDC(0);
如果(NULL!=hDc)
{
RGBGUAD*pArgb;
HBITMAP tBmp=::CreateDIBSection(hDc,(BITMAPINFO*)和bi,DIB_RGB_颜色,(void**)和pArgb,NULL,0);
如果(空!=tBmp)
{
int x,y;
德沃德·比茨;
pBits=(DWORD*)pArgb;
对于(y=0;y

tBmp将是一个完全透明的320 x 240位图

我还找到了不使用GDI+的解决方案

BITMAPV5HEADER bi = {sizeof(BITMAPV5HEADER), 320, 240, 1, 32, BI_BITFIELDS, 0, 0, 0, 0, 0, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000};
HDC hDc = ::CreateCompatibleDC(0);

if(NULL != hDc)
{
    RGBQUAD* pArgb;
    HBITMAP tBmp = ::CreateDIBSection(hDc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&pArgb, NULL, 0);

    if(NULL != tBmp)
    {
        int x, y;
        DWORD pBits;

        pBits = (DWORD*)pArgb;
        for(y = 0; y < bi.bV5Height; y++)
        {
            for(x = 0; x < bi.bV5Width; x++)
            {
                *pBits = 0;
                pBits++;
            }
        }
    }
    ::DeleteObject(hDc);
}
BITMAPV5HEADER bi={sizeof(BITMAPV5HEADER),320,240,1,32,bi_位字段,0,0,0,0,0x00FF0000,0x0000FF00,0x000000FF,0xFF000000};
HDC HDC=::CreateCompatibleDC(0);
如果(NULL!=hDc)
{
RGBGUAD*pArgb;
HBITMAP tBmp=::CreateDIBSection(hDc,(BITMAPINFO*)和bi,DIB_RGB_颜色,(void**)和pArgb,NULL,0);
如果(空!=tBmp)
{
int x,y;
德沃德·比茨;
pBits=(DWORD*)pArgb;
对于(y=0;y

tBmp将是一个完全透明的320 x 240位图

如果整个图像是透明的,那么为什么还要有一个图像?我想用这个图像作为其他操作的基础。如果整个图像是透明的,那么为什么要有一个图像呢?我想用这个图像作为其他操作的基础。问题是如何创建这个图像以及如何设置不透明度值?”CreateBitmap'不提供任何设置不透明度的方法。
CreateBitmap()
允许您创建32位位图,但没有API用于设置像素的不透明度。您必须直接操作像素数据
CreateBitmap()
返回指向原始像素数据的指针,原始像素数据是一个二维像素数组。对于32位位图,每个像素将是4个字节,使数据中的每4个字节成为特定像素的alpha通道。您能给我指出设置第4个字节的任何示例吗?这是一个纯API应用程序。只需将
CreateBitmap()
返回的数据指针强制转换为
RGBQUAD*
指针,然后就可以在数组中循环,根据需要更新值。
RGBQUAD.rgbReserved
字段是每个像素的alpha通道。问题是如何创建此图像以及如何设置不透明度值CreateBitmap'不提供任何设置不透明度的方法。
CreateBitmap()
允许您创建32位位图,但没有API用于设置像素的不透明度。您必须直接操作像素数据
CreateBitmap()
返回指向原始像素数据的指针,原始像素数据是一个二维像素数组。对于32位位图,每个像素将是4个字节,使数据中的每4个字节成为特定像素的alpha通道。您能给我指出设置第4个字节的任何示例吗?这是一个纯API应用程序。只需将
CreateBitmap()
返回的数据指针强制转换为
RGBQUAD*
指针,然后就可以在数组中循环,根据需要更新值。
RGBQUAD.rgbReserved
字段是每个像素的alpha通道。