【发布时间】:2011-12-02 13:14:13
【问题描述】:
有谁知道我如何创建一个完全透明的图像或给定的图像 (HBITMAP) 我怎样才能完全擦除它以使其中的所有像素都 100% 透明?
谢谢。
【问题讨论】:
-
如果整个图像都是透明的,那为什么还要有图像呢?
-
我想将此图像用作其他操作的基础。
有谁知道我如何创建一个完全透明的图像或给定的图像 (HBITMAP) 我怎样才能完全擦除它以使其中的所有像素都 100% 透明?
谢谢。
【问题讨论】:
位图需要为 32 位,因此它有一个 Alpha 通道,您可以使用该通道设置不透明度值。如果您的图像不是 32 位的,则必须创建一个新的 32 位位图并将原始像素复制到其中。
【讨论】:
CreateBitmap() 允许您创建 32 位位图,但没有用于设置像素不透明度的 API。您必须直接操作像素数据。 CreateBitmap() 返回一个指向原始像素数据的指针,这是一个二维像素数组。对于 32 位位图,每个像素为 4 个字节,使数据中的每个第 4 个字节成为特定像素的 Alpha 通道。
CreateBitmap() 返回的数据指针类型转换为RGBQUAD* 指针,然后您可以循环遍历数组,根据需要更新值。 RGBQUAD.rgbReserved 字段是每个像素的 alpha 通道。
我也找到了不使用 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);
}
tBmp 将是一个完全透明的 320 x 240 位图
【讨论】:
您可以使用单色位图作为蒙版,从彩色位图创建透明图像。这是相当复杂的。请参阅this 示例(在 VB 中但直接使用 Win32 API)
或者,TransparentBlt 函数可能会使您尝试做的事情变得不必要。
【讨论】:
我在 GDI+ 中找到了答案。最好的方法是附加您正在使用 GDI+ 图形对象的图像的设备上下文,然后调用它的 clear 方法。
【讨论】: