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