2009-10-10 10 views
5

Ich schreibe oft Code, der Bilder rendert, indem ich Pixel direkt in Puffer schreibe, und es fällt mir oft schwer, einen guten Überblick darüber zu bekommen, was wirklich vor sich geht. Das Memory-Fenster im Debugger von Visual Studio ist etwas hilfreich, aber ich würde die Bilder gerne grafisch sehen.Debuggen von Bildrendern in Visual C++, hilfreiche Add-Ins?

Also meine Frage ist, weiß jemand eine Debugging-Erweiterung, die ein Stück Speicher als Bild in einem bestimmten Pixel-Format lesen und grafisch anzeigen kann?

+0

Ich interessiere mich für genau die gleiche Aufgabe. Gibt es Fortschritte bei dem Problem? Sie haben die Antwort mit dem Link zu imdebug akzeptiert, aber es erfordert Änderungen am Quellcode und widerspricht Ihrem eigenen Kommentar: http://stackoverflow.com/questions/1549129/debugging-image-rendering-im-visual-c-anyy-helpful -add-ins # comment1425286_1549543, oder? – Mikhail

Antwort

0

Ich habe meine alte Antwort verschrottet, da sie irrelevant war. Das neue on verwendet auch OpenCV (da ich versuche, ein OpenCV-Bild anzuzeigen), aber es kann an jedes Framework angepasst werden.

Der Kern Code ist, wo es einen Adressenspeicher nimmt address, und die Anzahl der Bytes durch numrows, numcols und byte_size und liest diese Bytes in einen Puffer zu lesen. Ich bin sicher, dass Sie , dass Teil des Codes für Ihre eigenen Bedürfnisse anpassen können.

#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; 
} 
+0

Ich dachte, ich wäre klar genug, dass mein Problem die Bilder zu einem bestimmten Zeitpunkt nicht anzeigen würde. Mein Problem ist, dass ich die Bilder anzeigen möchte, während ich den Code im Debugger durchschaue und sehen möchte, wie sich mein Schreibzeiger bewegt um. Ich bin nach einer Erweiterung des Debuggers, die zeigt, was mein Code tut, während ich es durchlaufe. – nielsm

+0

Es tut mir leid, und ich habe * endlich * um es zu implementieren :) – Jacob

+0

Für die Visualisierung von OpenCV-Bildern, siehe https://sourceforge.net/projects/nativeviewer/ – Mikhail

0
  1. Erstellen Sie eine Klasse Ihren Puffer + Metadaten (Breite, Höhe, schreiten, Pixelformat) enthält.
  2. Fügen Sie der Klasse ToStream() und FromStream() Methoden hinzu, um das Image (den Puffer und die Metadaten) zu serialisieren.
  3. Fügen Sie Ihrer Klasse eine ToWpfBitmapSource() hinzu.
  4. Erstellen Sie einen Debug-Visualizer, der Ihr Bild aus dem Stream deserialisiert, in WPFs BitmapSource konvertiert und in einem Image-Steuerelement in einem Winforms WPF-Host platziert.

wird Dieses Beispiel helfen: http://www.codeproject.com/KB/WPF/WPF_Glimps.aspx

Die Klasse kann in einem separaten DLL in C++ CLI hinzugefügt werden.

1

Was Sie für Fragen in nativer c natürlich nicht annähernd schafft ++. Die gesamte Visualisierungstechnologie im visuellen Debugger ist um die CLR organisiert, also entweder C# oder C++/CLI.

Die eine Sache, die im Heimatland helfen kann, ist der Mechanismus expression evaluator addin.Natürlich ist es darauf ausgelegt, eine Zeichenkette zurückzugeben und wegzugehen, aber es ist Code, so dass Sie theoretisch Code ausführen könnten, einschließlich der Anzeige eines Fensters und der Anzeige der Daten, die Sie interessieren (nachdem Sie es aus dem Debugge gelesen haben).

Es ist ein bisschen ein Nachteil, diese großartigen Eigenschaften zu sehen, die auf der nativen Seite fehlen.

1

Ich entwickle ein Open-Source-Add-In, Visual Image Assist, für VC6/7/8/9 zum Anzeigen/Bearbeiten eines Bildes. Vielleicht möchtest du es auch.

+0

Gibt es Updates für das Projekt? Es ist nicht einmal klar, wie man die neueste Version erstellt. – Mikhail

+0

Ich hatte es jetzt nicht entwickelt. Ich habe es meinem Kollegen übertragen. Wenn er und ich Zeit haben, werden wir es verbessern. –

Verwandte Themen