如何在CreateDIBitmap函数中使用BITMAPV5HEADER

时间:2017-03-22 16:16:11

标签: c++ winapi gdi

我正在尝试使用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。

1 个答案:

答案 0 :(得分:4)

是的,类型转换很好。

BITMAPV5HEADER文档声明:

  

BITMAPV5HEADER结构是位图信息头文件。 它是BITMAPINFOHEADER结构的扩展版本。

BITMAPV5HEADER的前11个字段与BITMAPINFOHEADER中的字段匹配。因此,您可以安全地将类型转换的BITMAPV5HEADER*指针传递给期望lpbmih指针的BITMAPINFOHEADER*参数。

另一方面,lpbmi参数是另一个故事。它期待一个BITMAPINFO*指针,但你给它一个类型转换的BITMAPV5HEADER*指针。从技术上讲,BITMAPV5HEADER不是BITMAPINFO的扩展名,因此您应该传递单独的BITMAPINFO变量而不是BITMAPV5HEADER变量。

但是,BITMAPINFOBITMAPINFOHEADER开头,因此BITMAPV5HEADER的前11个字段将满足BITMAPINFO::bmiHeader字段。您将标题的biBitCount字段设置为32,biCompression字段设置为BI_RGB,因此没有使用颜色表,因此CreateDIBitmap()不会尝试访问BITMAPINFO::bmiColors 1}}字段并最终将您的BITMAPV5HEADER的alpha / gamma字段读取为RGB值。因此,在此特定配置中,将类型转换的BITMAPV5HEADER*指针传递到期望lpbmi指针的BITMAPINFO*参数也是“安全的”。