Отладка рендеринга изображений в Visual C ++, какие-нибудь полезные надстройки? - PullRequest
5 голосов
/ 11 октября 2009

Я часто пишу код, который отображает изображения, записывая пиксели непосредственно в буферы, и мне часто трудно получить хороший обзор того, что на самом деле происходит. Окно «Память» в отладчике Visual Studio несколько помогает, но я бы очень хотел увидеть изображения в графическом виде.

Итак, мой вопрос: кто-нибудь знает расширение отладки, которое может считывать кусок памяти как изображение в указанном формате пикселей и отображать его графически?

Ответы [ 6 ]

3 голосов
/ 04 ноября 2009

Такая вещь существует:

Утилита для простой отладки изображений в стиле printf в приложениях Win32 C / C ++.

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

Мой коллега в восторге от этого.

- * 1010 Крис *

1 голос
/ 08 октября 2010

Я разрабатываю надстройку с открытым исходным кодом, Visual Image Assist , для VC6 / 7/8/9, используемой для отображения / редактирования изображения.Может быть, вы тоже хотите.

1 голос
/ 08 ноября 2009

То, что вы просите, естественно не достижимо в нативном с ++. Все технологии визуализации внутри визуального отладчика организованы вокруг CLR, следовательно, либо C #, либо C ++ / CLI.

Единственное, что может помочь на родной земле - это механизм добавления выражения addin . Конечно, он предназначен для возврата строки и ее удаления, но это код, поэтому теоретически вы можете запустить любой код, включая отображение окна и показ данных, которые вам нужны (после прочтения их отладчиком).

Немного обидно видеть, что эти замечательные функции отсутствуют на родной стороне.

1 голос
/ 12 октября 2009

Мой коллега написал эту статью CodeProject для написания визуализаторов отладчика

http://www.codeproject.com/KB/showcase/BuildDebuggerVisualizer.aspx

Он использует наш продукт, инструментарий обработки изображений .NET, но его можно легко адаптировать для использования классов изображений .NET.

0 голосов
/ 11 октября 2009
  1. Создайте класс, содержащий ваш буфер + метаданные (ширина, высота, шаг, формат пикселя).
  2. Добавьте методы ToStream () и FromStream () в свой класс для (де) сериализации изображения (буфера и метаданных).
  3. Добавьте ToWpfBitmapSource () в ваш класс.
  4. Создайте отладочный визуализатор, который десериализует ваше изображение из потока, конвертирует его в BitmapSource WPF, размещает в элементе управления Image в хосте Winforms WPF.

Этот пример поможет: http://www.codeproject.com/KB/WPF/WPF_Glimps.aspx

Класс может быть добавлен в C ++ CLI в отдельной DLL.

0 голосов
/ 11 октября 2009

Я отказался от своего старого ответа, так как он был неуместен. В новой версии также используется OpenCV (поскольку я пытаюсь отобразить изображение OpenCV), но его можно адаптировать к любой среде.

Код core - это место, где он берет адрес памяти address и количество байтов для чтения через numrows, numcols и byte_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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...