2009-10-10 19 views
5

Tôi thường viết mã hiển thị hình ảnh bằng cách viết các pixel trực tiếp vào bộ đệm và tôi thường thấy khó để có được cái nhìn tổng quan về những gì đang diễn ra. Cửa sổ bộ nhớ trong trình gỡ lỗi của Visual Studio là một phần giúp đỡ, nhưng tôi thực sự thích nhìn thấy hình ảnh đồ họa.Gỡ lỗi hiển thị hình ảnh trong Visual C++, bất kỳ phần bổ trợ hữu ích nào?

Vì vậy, câu hỏi của tôi là, có ai biết một phần mở rộng gỡ lỗi có thể đọc một đoạn bộ nhớ dưới dạng ảnh ở định dạng pixel được chỉ định và hiển thị đồ họa không?

+0

Tôi quan tâm đến chính xác cùng một tác vụ. Có tiến bộ nào về vấn đề này không? Bạn đã chấp nhận câu trả lời có liên kết tới imdebug, nhưng nó yêu cầu sửa đổi mã nguồn và mâu thuẫn với nhận xét của riêng bạn: http://stackoverflow.com/questions/1549129/debugging-image-rendering-in-visual-c-any-helpful -add-ins # comment1425286_1549543, phải không? – Mikhail

Trả lời

3

Điều như vậy tồn tại:

Một tiện ích để gỡ lỗi kiểu hình ảnh đơn giản trong các ứng dụng Win32 C/C++.

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

Đồng nghiệp của tôi say mê nó.

--chris

0

Tôi đã xóa câu trả lời cũ vì nó không liên quan. Mới cũng được sử dụng OpenCV (kể từ khi tôi đang cố gắng để hiển thị một hình ảnh OpenCV) nhưng nó có thể được thích nghi với bất kỳ khuôn khổ.

Các lõi code đang nơi nó cần một địa chỉ bộ nhớ address, và số byte đọc qua numrows, numcols, và byte_size và đọc những byte vào một bộ đệm. Tôi chắc chắn bạn có thể điều chỉnh rằng phần mã cho nhu cầu của riêng bạn.

#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

Tôi nghĩ rằng tôi đã rõ ràng rằng vấn đề của tôi không hiển thị hình ảnh tại một số điểm, vấn đề của tôi là tôi muốn hiển thị hình ảnh trong khi tôi bước qua mã bên trong trình gỡ lỗi và muốn xem cách con trỏ viết của tôi di chuyển xung quanh. Tôi là sau khi một phần mở rộng cho trình gỡ lỗi cho thấy những gì mã của tôi không khi tôi bước qua nó. – nielsm

+0

Tôi xin lỗi vì điều đó và tôi đã * cuối cùng * nhận được xung quanh để thực hiện nó :) – Jacob

+0

Để hiển thị hình ảnh OpenCV, hãy xem https://sourceforge.net/projects/nativeviewer/ – Mikhail

0
  1. Tạo một lớp chứa đệm + siêu dữ liệu của bạn (chiều rộng, chiều cao, sải chân, pixelformat).
  2. Thêm phương thức ToStream() và FromStream() vào lớp của bạn để (de) serializing image (bộ đệm và siêu dữ liệu).
  3. Thêm một ToWpfBitmapSource() vào lớp học của bạn.
  4. Tạo trình xử lý hình ảnh gỡ rối để deserializes hình ảnh của bạn từ luồng, chuyển đổi sang BitmapSource của WPF, đặt trong điều khiển Hình ảnh, trong máy chủ WPF Winforms.

Ví dụ này sẽ giúp: http://www.codeproject.com/KB/WPF/WPF_Glimps.aspx

Các lớp có thể được thêm vào trong C++ CLI trong một DLL riêng biệt.

1

Một đồng nghiệp của tôi đã viết bài viết này CodeProject để viết visualizers Debugger

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

Nó sử dụng sản phẩm của chúng tôi, một bộ công cụ .NET hình ảnh, nhưng nó có thể dễ dàng được điều chỉnh để sử dụng các lớp hình ảnh NET để thay thế.

1

Điều bạn đang yêu cầu không thể đạt được một cách tự nhiên trong gốc C++. Tất cả các công nghệ trực quan bên trong trình gỡ lỗi trực quan được tổ chức xung quanh CLR, do đó hoặc là C# hoặc C++/CLI.

Điều duy nhất có thể trợ giúp ở quê hương là cơ chế expression evaluator addin.Tất nhiên, nó được thiết kế để trả về một chuỗi và biến mất, nhưng đó là mã, vì vậy bạn có thể chạy lý thuyết bất kỳ mã nào, bao gồm hiển thị cửa sổ và hiển thị dữ liệu bạn quan tâm (sau khi đọc nó từ debuggee).

Hơi tiếc khi thấy các tính năng tuyệt vời đó thiếu từ phía gốc.

1

Tôi đang phát triển một phần bổ trợ nguồn mở, Visual Image Assist, cho VC6/7/8/9 được sử dụng để hiển thị/chỉnh sửa hình ảnh. Nó có thể là bạn muốn, quá.

+0

Có bất kỳ thông tin cập nhật nào về dự án không? Nó thậm chí không rõ ràng làm thế nào để xây dựng phiên bản mới nhất. – Mikhail

+0

Tôi đã không phát triển nó ngay bây giờ. Tôi đã chuyển nó cho đồng nghiệp của tôi. Nếu anh ấy và tôi có thời gian, chúng tôi sẽ cải thiện nó. –

Các vấn đề liên quan