C++ 在visualc+中调试图像渲染+;,有什么有用的插件吗?

C++ 在visualc+中调试图像渲染+;,有什么有用的插件吗?,c++,visual-studio,debugging,image,graphics,C++,Visual Studio,Debugging,Image,Graphics,我经常编写代码,通过将像素直接写入缓冲区来渲染图像,我经常发现很难很好地了解实际情况。VisualStudio调试器中的内存窗口在某种程度上是一个帮助,但我非常希望以图形方式查看图像 所以我的问题是,有没有人知道一个调试扩展可以将内存块读取为指定像素格式的图片,并以图形方式显示它?我放弃了我以前的答案,因为它与此无关。新版本也使用了OpenCV(因为我试图显示OpenCV图像),但它可以适应任何框架 核心代码是它获取一个内存地址address,以及通过numrows、numcols和byte\u

我经常编写代码,通过将像素直接写入缓冲区来渲染图像,我经常发现很难很好地了解实际情况。VisualStudio调试器中的内存窗口在某种程度上是一个帮助,但我非常希望以图形方式查看图像


所以我的问题是,有没有人知道一个调试扩展可以将内存块读取为指定像素格式的图片,并以图形方式显示它?

我放弃了我以前的答案,因为它与此无关。新版本也使用了OpenCV(因为我试图显示OpenCV图像),但它可以适应任何框架

核心代码是它获取一个内存地址
address
,以及通过
numrows
numcols
byte\u size
读取的字节数,并将这些字节读入缓冲区。我相信您可以根据自己的需要调整代码的这一部分

#include "stdafx.h"
#include <windows.h>
#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace std;
using namespace cv;

void imshow_debug(const LPCVOID address, const int numrows, const int numcols, const int type, const int byte_size, const int step, const string windows_title)
{
    // Initialize
    unsigned long PID; 
    SIZE_T read_bytes = 0;

    // Allocate space for the image
    const int bytes_to_read = numrows*numcols*byte_size;
    uchar *image_data = new uchar[bytes_to_read];
    Mat Image(numrows,numcols,type,image_data,step);

    // Get the handle and PID
    HWND handle = FindWindowA(0, windows_title.c_str());
    if (!FindWindowA(0, windows_title.c_str())) 
    { 
        printf("Window %s not found!", windows_title); 
        exit(0); 
    }
    GetWindowThreadProcessId(handle, &PID);  /* Get windows PID from a window handle */
    HANDLE WindowsProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, PID);

    // Read the image
    ReadProcessMemory(WindowsProcessHandle,address,image_data,bytes_to_read,&read_bytes);   
    if(bytes_to_read != read_bytes) 
    {
        cout<<"Could not read entire image"<<endl; 
        exit(0);
    }

    // Display the image
    namedWindow("Image");
    imshow("Image",Image);
    waitKey();

    // Clean up
    CloseHandle(WindowsProcessHandle);
    delete[]image_data;
}

int main(int argc, char* argv[])
{
    imshow_debug((LPVOID)0x03af0370,300,300,CV_64F,sizeof(double),2400,"C:\\Documents and Settings\\jacobm\\My Documents\\Visual Studio 2005\\Projects\\Head\\debug\\SSR_VideoComp.exe");
    return 0;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
无效imshow调试(常量LPCVOID地址、常量int numrows、常量int numcols、常量int类型、常量int字节大小、常量int步长、常量字符串窗口标题)
{
//初始化
无符号长PID;
读取字节的大小=0;
//为图像分配空间
const int bytes_to_read=numrows*numcols*byte_size;
uchar*image\u data=新的uchar[字节到读取];
Mat图像(numrows、numcols、类型、图像数据、步骤);
//获取句柄和PID
HWND handle=FindWindowA(0,windows_title.c_str());
如果(!FindWindowA(0,windows_title.c_str()))
{ 
printf(“未找到窗口%s!”,窗口标题);
出口(0);
}
GetWindowThreadProcessId(句柄,&PID);/*从窗口句柄获取窗口PID*/
HANDLE WindowsProcessHandle=OpenProcess(PROCESS\u ALL\u ACCESS,false,PID);
//阅读图片
ReadProcessMemory(WindowsProcessHandle、地址、图像数据、字节到字节读取和读取字节);
如果(字节到读取!=读取字节)
{
库特
  • 创建一个包含缓冲区+元数据(宽度、高度、步幅、像素格式)的类
  • 将ToStream()和FromStream()方法添加到类中,以便(反)序列化图像(缓冲区和元数据)
  • 将ToWpfBitmapSource()添加到类中
  • 创建一个调试可视化工具,将图像从流中反序列化,转换为WPF的BitmapSource,放置在Winforms WPF主机内的图像控件中
  • 这个例子将有助于:


    类可以在C++的CLI中添加到一个单独的DLL中。

    < P>我的一个同事写了这个代码项目文章来写Debugger Visualizers < /P>

    它使用了我们的产品.NET imaging toolkit,但它可以很容易地调整为使用.NET图像类。

    存在这样一种情况:

    用于在Win32 C/C++应用程序中调试图像的简单printf样式的实用程序

    我的同事对此赞不绝口


    克里斯

    你所要求的不是天生的C++所能达到的。 可视化调试器中的所有可视化技术都是围绕CLR组织的,因此可以是C#或C++/CLI

    在native land中,唯一有帮助的是机制。当然,它被设计为返回字符串并离开,但它是代码,因此理论上你可以运行任何代码,包括显示窗口和显示你关心的数据(在从调试对象读取数据后)


    但是,看到本机缺少这些强大的功能,我有点不高兴。

    我正在为VC6/7/8/9开发一个开源插件,用于显示/编辑图像。这可能也是你想要的。

    我想我很清楚,我的问题是在某个时候没有显示图像,我的问题是,我想在查看图像时显示图像单步浏览调试器内的代码,并想了解我的写指针是如何移动的。我正在寻找调试器的扩展,该扩展显示了我的代码在逐步执行时的功能。对此我很抱歉,我终于开始着手实现它:)对于OpenCV图像的可视化,请参阅我对完全相同的任务感兴趣。是吗e这个问题有什么进展吗?你已经接受了带有imdebug链接的答案,但它需要修改源代码,并且与你自己的评论相矛盾:,不是吗?项目有任何更新吗?甚至不清楚如何构建最新版本。我现在还没有开发它。我已经将它转移给了我的同事。如果他和我有时间,我们将改进它。