我正在尝试使用BITMAPV5HEADER
创建一个具有Alpha通道的位图:
DECLARE @startversion int = 56, @endversion int = 56
SELECT
PC_ProductVersion.ProductVersionID AS ProductVersionID,
Product.ProductName,
PC_ProductVersion.ReleasedVersion,
PC_DataNameLengths.PC_DataName AS PC_DataName,
PC_DataItemOffsets.Offset AS DataItemOffset,
PC_DataNameLengths.Offset AS ataNameIndex,
(PC_FormatType.storagesize * Module.ArraySize * DataItem.ArraySize *
CASE DataType.grouped
WHEN 0 THEN 1
ELSE 8
END
) AllocationSize,
HOST_NAME()
FROM DataItem
INNER JOIN PC_DataNameLengths
ON DataItem.DataName = PC_DataNameLengths.DataName
INNER JOIN DataType
ON DataType.DataTypeName = DataItem.DataTypeName
AND DataType.ProductVersionID = DataItem.ProductVersionID
INNER JOIN Module
ON Module.ModuleName = DataItem.ModuleName
AND Module.ProductVersionID = DataItem.ProductVersionID
INNER JOIN ProductPerModule
ON ProductPerModule.ProductVersionID = Module.ProductVersionID
AND ProductPerModule.ModuleName = Module.ModuleName
INNER JOIN PC_DataItemOffsets
ON PC_DataItemOffsets.DataName = DataItem.DataName
AND PC_DataItemOffsets.HostName = HOST_NAME()
INNER JOIN PC_ProductVersion
ON PC_ProductVersion.ProductVersionID = PC_DataItemOffsets.ProductVersionID
AND PC_ProductVersion.ProductVersionID = ProductPerModule.ProductVersionID
INNER JOIN Product
ON Product.ProductName = ProductperModule.ProductName
INNER JOIN Format
ON Format.FormatName = DataItem.FormatName
AND Format.ProductVersionID = DataItem.ProductVersionID
INNER JOIN PC_ProductSupport
ON PC_ProductSupport.ProductVersionID = Module.ProductVersionID
AND PC_ProductSupport.ProductName= Product.ProductName
AND PC_ProductSupport.PCSupport = 1
INNER JOIN PC_FormatType
ON PC_FormatType.FormatTypeName = Format.FormatTypeName
WHERE
DataItem.ProductVersionID >= @startversion
AND DataItem.ProductVersionID <= @endversion
但我不确定类型转换是否正确。 CreateDIBitmap()
documentation不清楚,因为在字段定义中它说:
在 const BITMAPINFOHEADER * lpbmih,
并在说明中:
lpbmih [in]
指向位图信息头结构的指针,BITMAPV5HEADER。
答案 0 :(得分:4)
是的,类型转换很好。
BITMAPV5HEADER
文档声明:
BITMAPV5HEADER
结构是位图信息头文件。 它是BITMAPINFOHEADER
结构的扩展版本。
BITMAPV5HEADER
的前11个字段与BITMAPINFOHEADER
中的字段匹配。因此,您可以安全地将类型转换的BITMAPV5HEADER*
指针传递给期望lpbmih
指针的BITMAPINFOHEADER*
参数。
另一方面,lpbmi
参数是另一个故事。它期待一个BITMAPINFO*
指针,但你给它一个类型转换的BITMAPV5HEADER*
指针。从技术上讲,BITMAPV5HEADER
不是BITMAPINFO
的扩展名,因此您应该传递单独的BITMAPINFO
变量而不是BITMAPV5HEADER
变量。
但是,BITMAPINFO
以BITMAPINFOHEADER
开头,因此BITMAPV5HEADER
的前11个字段将满足BITMAPINFO::bmiHeader
字段。您将标题的biBitCount
字段设置为32,biCompression
字段设置为BI_RGB
,因此没有使用颜色表,因此CreateDIBitmap()
不会尝试访问BITMAPINFO::bmiColors
1}}字段并最终将您的BITMAPV5HEADER
的alpha / gamma字段读取为RGB值。因此,在此特定配置中,将类型转换的BITMAPV5HEADER*
指针传递到期望lpbmi
指针的BITMAPINFO*
参数也是“安全的”。