VS Image Watch 扩展 natvis 用于 BITMAPINFOHEADER?

2024-03-07

Visual Studio 的图像观察扩展(http://goo.gl/TRe0X http://goo.gl/TWre0X)允许您在调试时查看内存中的位图。非常有用,但是我一直试图定义一个 natvis 文件以允许查看 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]”部分,试图计算像素数据的偏移量。 $ 是试图理解 natvis 文件真正用途的薄弱尝试。

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

是否有人已经拥有一个 natvis 文件来处理和显示 Image Watch 的 BITMAPINFOHEADER 类型?或者对如何让这个工作有一个建议。谢谢。


只需要对你所拥有的进行一些调整即可。

  • 看起来您几乎可以使用调试器中的表达式,因此更改为仅使用“this”代替 $
  • 步幅是行的大小(以字节为单位)。
  • 对于结构,您必须使用标记命名空间名称,然后通过 AlternativeType 将别名添加到 typedef。
  • 我的 Pixel 格式是 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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS Image Watch 扩展 natvis 用于 BITMAPINFOHEADER? 的相关文章

随机推荐