Your extension will be available shortly on the Visual Studio Marketplace at this link.

Image Watch

Microsoft Free

Provides a watch window for visualizing in-memory images (bitmaps) when debugging native C++ code.

4.7 Star
Visual Studio
2015, 2013, 2012
Download (83,849)
E-mail Twitter Digg Facebook
Add to favorites
Sign in to write a review
Sort by:

5 Star
by acajic | November 11 2016

Great extension but to this date not working on VS2015 Update 3.

Visual Studio reports:

"Could not load this custom viewer."

3 Star
by Chris Varnsverry | August 17 2016

Useful but incredibly buggy, and difficult to get valid natvis working with ImageViewer. Could do with some diagnostic output. and some natvis only work in 2013 and not 2015.

5 Star
by Ernest Galbrun | July 19 2016

Excellent tool, a must-have for image processing developers.

5 Star
by LotosBluete | June 14 2016

Was easy to adapt to our own internal image format.
Thanks a lot

5 Star
by ZygfrydWieszok | June 08 2016

Brilliant extension. Ultimately handy when working with OpenCV.

5 Star
by Luka Lukic | September 20 2015

5 Star
by KayleXuan | September 13 2015

Never have I seen a more powerful tool than this one in img processing.

4 Star
by FlorianG73 | August 25 2015

Exxxcellent tool ! Very helpfull for debuging.

Will get the fifth star when support for 1Bpp and CMYK images will be available.

5 Star
by Goran Dubajic | August 06 2015

Great tool!
Bug: debugging from VS2015 with platform toolset VS2013 in Image Watch it states [invalid] for an image which is correctly displayed when debugging from VS2013. If platform toolset is VS2015 everything works OK.

5 Star
by olvrw | July 22 2015

5 Star
by StevenHickson | July 17 2015

I really can't say enough about this plugin. It makes debugging for computer vision much easier and faster.
The visualization of custom classes is easy and also a great addition.

5 Star
by zzdrghost | May 05 2015


5 Star
by SergBabiychuk | April 16 2015

Great tools!
But I would like to see support:
1) for Qt5 objects: QImage,QPixmap(QBitmap)
2) for any pointers, with user selection of image parameters while debugging

5 Star
by Baris Demiroz | March 24 2015

5 Star
by Eejdoowad | March 13 2015

5 Star
by Jaka Konda | March 03 2015

5 Star
by vuki | February 27 2015

A must if you program with OpenCV

5 Star
by bambambigelow | January 28 2015

this is an amazing extension! works like a charm and saves a lot of hassle while debugging opencv code

5 Star
by Y.T. Tommy HU | January 08 2015

5 Star
by Lukas Neumann1 | December 19 2014

Works like a charm, this add-in is a must for everyone working with OpenCV in Visual Studio.

1 - 20 of 48 Items   
Sign in to start a discussion

  • Visual Studio 15 Support
    1 Posts | Last post November 14, 2016
    • Are there any plans to make it compatible with Visual Studio 15.
      As the preview is out already, it would be really helpful.
  • Can I make it work with IplImage in C#?
    1 Posts | Last post October 06, 2016
    • Hi,
      I am using OpencvSharp in C# and had DebuggerVisualizer hooked into my VS2015 to see IplImage objects nicely. ANd I recently found Image Watch extension and it looks very cool. Is there a way to hook it into IplImage in C#?
  • Installation failure
    1 Posts | Last post September 22, 2016
    • Hi,
      This looks like a very promising extension and I really wish to use it with openCV. But I am having some problem with its installation. I am using VS 2013 Express. I downloaded the .vsix file from this page and tried to install it. This is the error I get (from the install log):
       VSIXInstaller.NoApplicableSKUsException: This extension is not installable on any currently installed products.
         at VSIXInstaller.App.InitializeInstall()
         at System.Threading.Tasks.Task.InnerInvoke()
         at System.Threading.Tasks.Task.Execute()
      I also tried searching for Image Watch extension in Tools->Extensions and Updates->Online but could not find it there.
      I am a total noob with regard to installing extensions on Visual studio. Could you please tell me what's wrong here?
  • Difference in behaviour between 2013 and 2015
    1 Posts | Last post August 17, 2016
    • The following natvis works with Image Viewer in 2013 but not in 2015:
      <Type Name="MyType">
            <Synthetic Name="[type]" Condition="thing == 0">
            <Synthetic Name="[channels]">
            <Item Name="[width]">memberPointer->data.width</Item>
            <Item Name="[height]">memberPointer->data.height</Item>
            <Item Name="[data]">memberDataPointer</Item>
            <Item Name="[stride]" Condition="thing == 0">pitchinpixels * 2 * 4</Item>
      Although try as i might I can't get it to honour the RGBA, it always renders as BGRA.
      Please open source this so we can fix it!!
  • User type won't display using natvis, but does using @mem
    1 Posts | Last post July 22, 2016
    • I'm trying to get QImage to work with this. For debugging purposes, I am using the following .natvis definition:
        <Type Name="QImage">
          <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
        <Type Name="QImage">
          <DisplayString>{{UINT8, 4 x 21 x 295}}</DisplayString>
            <Synthetic Name="[type]">
            <Item Name="[channels]">4</Item>
            <Item Name="[width]">295</Item>
            <Item Name="[height]">21</Item>
            <Item Name="[data]">((Qt5Guid.dll!QImageData*)d)->data</Item>
            <Item Name="[stride]">1180</Item>
      The ImageWatch log shows this getting picked up (+ Found type QImage ... + -> Registering QImage) and my Autos/Watch windows show the correct stuff underneath, so I know the natvis is working.  However, I still get invalid image. The catch here, is that I can use almost the exact same definition with @mem and it works!
      Note: img is the local variable, hence the need for it in @mem.  The above expression for the data ptr, and the [data] element both show in the debugger with the same value and type, unsigned char*.  If I change the natvis to hardcode the address as 0x06a10000, it still says invalid!
      At this point it's either a typo that's become invisible to me, or some configuration error.  If there was a more useful level of logging, that would probably have pinpointed my mistake by now.
      I'm also very thankful that you guys put this together, but if you're not going to actively maintain it, open source it so we can fix things.  I've spent more time trying to debug ImageWatch then my actual program..
  • Remote debugging with Image Watch causes Visual Studio to freeze
    1 Posts | Last post July 05, 2016
    • Thanks for the amazing extension. I am using Visual Studio to remotely deploy projects on linux, everything works fine but if I have Image Watch enabled it will cause Visual Studio to freeze and goes not responding. Any suggestions to fix this issue ?
      Many thanks
  • Bug of showing the part of an image using cv::Range if containing the last row
    1 Posts | Last post June 22, 2016
    • Image Watch has problems of showing the part of an image using cv::Range if containing the last row. This bug has also been reported on stackoverflow:
          cv::Mat B = A(cv::Range::all(), cv::Range::all());           // no problem
          cv::Mat B = A(cv::Range(0, A.rows - 1), cv::Range::all());   // no problem
          cv::Mat B = A(cv::Range(0, A.rows), cv::Range::all());       // have problem, if contain the last row
  • Invalid Images
    2 Posts | Last post May 29, 2016
    • I'm attempting to get a template image class to be displayed, but all I get are invalid images.  I'm able to draw the images to the screen, output them to a file, etc, so I'm pretty sure all the data is correct.  My natvis file gets loaded correctly by the debugger (I can see all the various data fields, and they all have correct values).  Here's a simplified version of my class and the natvis file:
      namespace tltImaging
      template <typename T>
      class cImage:public cImageBase
           int mNumChannels;
           int mWidth;
           int mHeight;
           T*  mData;
      <AutoVisualizer xmlns="">
        <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" MenuName="Add to Image Watch"/>
        <Type Name="tltImaging::cImage&lt;*&gt;">
          <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
        <Type Name="tltImaging::cImage&lt;*&gt;">
            <Synthetic Name="[type]" Condition='strcmp("unsigned char", "$T1") == 0'>
            <Item Name="[channels]">mNumChannels</Item>
            <Item Name="[width]">mWidth</Item>
            <Item Name="[height]">mHeight</Item>
            <Item Name="[data]">mData</Item>
            <Item Name="[stride]">mWidth*mNumChannels*sizeof($T1)</Item>
    • Hi, I met the same problem, but finally I found out that the Image Watch works only if you put the .natvis under this directory "C:\Users\***\Documents\Visual Studio 2015\Visualizers", as is instructed in the help page. 
      Otherwise even though the Visual Studio shows the debug information, Image Watch won't recognize it. 
      Wish you good luck :)
  • Does not work in VS2015 Update 2 with my type
    3 Posts | Last post April 26, 2016
    • Hello.
      Bellow the minimum reproducible code:
      #include "stdafx.h"
      #include <windows.h>
      class TestImage {
      	virtual ~TestImage() {
      		delete[] pData;
      	BYTE* pData;
      	BITMAPINFO m_Bmi;
      class TestImage8bit : public TestImage {
      	TestImage8bit(int Rows, int Cols) {
      		m_Bmi.bmiHeader.biWidth = Cols;
      		m_Bmi.bmiHeader.biHeight = Rows;
      		m_Bmi.bmiHeader.biBitCount = 8;
      		m_Bmi.bmiHeader.biXPelsPerMeter = (int)(1000.0F / 0.1f + 0.5F);
      		m_Bmi.bmiHeader.biYPelsPerMeter = (int)(1000.0F / 0.1f + 0.5F);
      		m_Bmi.bmiHeader.biPlanes = 1;
      		m_Bmi.bmiHeader.biSize = 40;
      		m_Bmi.bmiHeader.biSizeImage = Cols*Rows;
      		m_Bmi.bmiHeader.biClrUsed = 256;
      		pData = new BYTE[Cols*Rows];
      		memset(pData, 40, Cols*Rows);
      	~TestImage8bit() {}
      int main()
      TestImage* pIm = new TestImage8bit(50, 50);
          return 0;
    • Sorry, I clicked "Submit" before the time...
      bellow the natvis snippet:
        <Type Name="TestImage">
          <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
         <Type Name="TestImage">
            <Synthetic Name="[type]">
            <Item Name="[channels]">m_Bmi.bmiHeader.biBitCount/8</Item>
            <Item Name="[width]">m_Bmi.bmiHeader.biWidth</Item>
            <Item Name="[height]">m_Bmi.bmiHeader.biHeight</Item>
            <Item Name="[data]">pData</Item>
            <Item Name="[stride]">m_Bmi.bmiHeader.biWidth*(m_Bmi.bmiHeader.biBitCount/8)</Item>
      It is working well in VS2013 and does not work in VS 2015
    • Hello. I've found some things about this issue.
      The problem happens with hierarchy of image classes, for example:
      class Image{};//The base class
      class Image8bit : public Image{}; 
      class Image24bit : public Image{};
      class Image32bit : public Image{};
      and we are manages pointer of type Image* to hold concrete images.
      If we declare in natvis only Image class, the visualizer shows "Invalid" for Image* pImage pointers. It worked well in VisualStudio 2013.
      My temporary workaround is to declare all derived image types in natvis, to add pointer Image* pImage to VS watch window, explicitly cast the pointer to concrete type (in the watch window), than to open the visualizer, and than visualizer shows the image.
  • make it open source
    2 Posts | Last post April 22, 2016
    • Seeing how more and more MS projects go open source this one should definitely be among them. Especially considering that it is neglected.
    • seconded
1 - 10 of 103 Items