2009-10-10 6 views
5

J'écris souvent du code qui rend les images en écrivant des pixels directement dans des tampons et j'ai souvent du mal à avoir une bonne vue d'ensemble de ce qui se passe réellement. La fenêtre de mémoire dans le débogueur de Visual Studio est un peu une aide, mais j'aimerais vraiment voir les images graphiquement. Donc, ma question est, est-ce que quelqu'un sait d'une extension de débogage qui peut lire un morceau de mémoire comme une image dans un format de pixel spécifié et l'afficher graphiquement?Déboguer le rendu d'image dans Visual C++, des compléments utiles?

+0

Je m'intéresse exactement à la même tâche. Y a-t-il des progrès sur le problème? Vous avez accepté la réponse avec un lien vers imdebug, mais cela nécessite des modifications du code source et contredit votre propre commentaire: http://stackoverflow.com/questions/1549129/debugging-image-rendering-in-visual-c-any-helpful -add-ins # comment1425286_1549543, n'est-ce pas? – Mikhail

Répondre

3

Une telle chose existe:

Un utilitaire pour le débogage simple, de style printf d'images dans les applications Win32 C/C.

http://billbaxter.com/projects/imdebug/

Mon collègue de travail raves à ce sujet.

--Chris

0

J'ai mis au rebut ma vieille réponse car elle n'était pas pertinente. Le nouveau sur OpenCV également utilisé (puisque j'essaie d'afficher une image OpenCV) mais il peut être adapté à n'importe quel framework.

Le noyau de codeest là où il faut une adresse de mémoire address, et le nombre d'octets à lire à travers numrows, numcols et byte_size et lit les octets dans un tampon. Je suis sûr que vous pouvez adapter partie du code pour vos propres besoins.

#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

Je pensais avoir été assez clair pour que mon problème n'affiche pas les images à un moment donné, mon problème est que je veux afficher les images pendant que je parcours le code dans le débogueur et que je veux voir comment se déplace mon pointeur d'écriture autour. Je suis après une extension du débogueur qui montre ce que fait mon code quand je le traverse. – nielsm

+0

Je suis désolé pour cela et j'ai * finalement * commencé à l'implémenter :) – Jacob

+0

Pour la visualisation des images OpenCV, voir https://sourceforge.net/projects/nativeviewer/ – Mikhail

0
  1. créer une classe contenant le tampon + métadonnées (largeur, hauteur, foulée, PixelFormat).
  2. Ajoutez des méthodes ToStream() et FromStream() à votre classe pour l'image (de) sérialisation (tampon et métadonnées).
  3. Ajoutez un ToWpfBitmapSource() à votre classe.
  4. Créez un visualiseur de débogage qui désérialise votre image du flux, convertit en BitmapSource de WPF, placé dans un contrôle Image, dans un hôte WPF Winforms.

Cet exemple vous aidera: http://www.codeproject.com/KB/WPF/WPF_Glimps.aspx

La classe peut être ajouté en C++ CLI dans une DLL séparée.

1

Qu'est-ce que vous demandez est pas naturellement achieveable dans C++ natif. Toute la technologie de visualisation à l'intérieur du débogueur visuel est organisée autour du CLR, d'où C# ou C++/CLI.

La seule chose qui peut aider dans la terre natale est le mécanisme expression evaluator addin.Bien sûr, il est conçu pour renvoyer une chaîne et s'en aller, mais c'est du code, donc vous pouvez en théorie exécuter n'importe quel code, y compris afficher une fenêtre et afficher les données qui vous intéressent (après l'avoir lu depuis le débogué). Cependant, il est un peu décevant de voir ces fonctionnalités manquantes du côté natif.

1

Je développe un complément open source, Visual Image Assist, pour VC6/7/8/9 utilisé pour afficher/modifier une image. C'est peut-être aussi ce que tu veux.

+0

Y a-t-il des mises à jour sur le projet? Il n'est même pas clair comment construire la dernière version. – Mikhail

+0

Je ne l'avais pas développé maintenant. Je l'ai transféré à mon collègue. Si lui et moi avons le temps, nous l'améliorerons. –

Questions connexes