VS图像观察扩展原生BITMAPINFOHEADER



Visual Studio的Image Watch扩展(http://goo.gl/TWre0X)允许您在调试时查看内存中的位图。非常有用,但是我一直在尝试定义一个原生文件来允许查看dib或BITMAPINFOHEADER,甚至只是BITMAPINFO对象。

以下是我目前的记录:

  <?xml version="1.0" encoding="utf-8"?>
  <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
    <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1"
                  MenuName="Add to Image Watch"/>
    <Type Name="BITMAPINFOHEADER">
      <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
    </Type>
    <Type Name="BITMAPINFOHEADER">
      <Expand>
        <Synthetic Name="[type]">
          <DisplayString>UINT8</DisplayString>
        </Synthetic>
        <Synthetic Name="[channels]">
          <DisplayString>RGB</DisplayString>
        </Synthetic>
        <Item Name="[width]">biWidth</Item>
        <Item Name="[height]">biHeight</Item>
        <Item Name="[data]">(BYTE *)$ + sizeof(BITMAPINFOHEADER) + biClrUsed * 4</Item>
        <Item Name="[stride]">biBitCount*3</Item>
      </Expand>
    </Type>  
  </AutoVisualizer>

问题显然是"[data]"部分,试图计算像素数据的偏移量。$是试图理解native文件真正在做什么的弱尝试。

Image Watch的文档和一些用户定义类型的示例native文件(BITMAPINFOHEADER属于用户定义,不知道为什么):http://goo.gl/zt2uCh

是否有人已经有一个本地文件,处理和显示BITMAPINFOHEADER类型的图像手表?或者有一个关于如何让这个工作的建议。谢谢。

只需要稍微调整一下。

  • 看起来你几乎可以从调试器中使用表达式,所以把$
  • 改为只使用"this"来代替$
  • 步幅是行大小,以字节为单位。
  • 对于structs,你必须使用标签命名空间的名称,然后通过AlternativeType为typedef添加别名。
  • 我的像素格式是BGR
  • 每一行的字节大小必须是4的倍数,所以我也填充步幅来匹配(Image Watch似乎丢弃不完整的像素)。

<Type Name="tagBITMAPINFOHEADER">
    <AlternativeType Name="BITMAPINFOHEADER"></AlternativeType>
    <Expand>
        <Synthetic Name="[type]">
            <DisplayString Condition="biBitCount==24">UINT8</DisplayString>
            <DisplayString Condition="biBitCount==32">UINT8</DisplayString>
            <DisplayString Condition="biBitCount==48">UINT16</DisplayString>
        </Synthetic>
        <Synthetic Name="[channels]">
            <DisplayString Condition="biBitCount==32">BGRA</DisplayString>
            <DisplayString Condition="biBitCount==24">BGR</DisplayString>
            <DisplayString Condition="biBitCount==48">BGR</DisplayString>
        </Synthetic>
        <Item Name="[width]">biWidth</Item>
        <Item Name="[height]">biHeight</Item>
        <Item Name="[data]">((BYTE *)this) + sizeof(BITMAPINFOHEADER) + (biClrUsed * 4)</Item>
        <Item Name="[stride]">((biBitCount/8)*biWidth)+((4 - (((biBitCount/8)*biWidth)%4))%4)</Item>
    </Expand>
</Type>

最新更新