2013-02-16 82 views
0

我正在编程图像查看器作为学校的任务,我不能使用任何库来阅读或操作图像。首先我以bmp格式开始。我已经创建了类来处理这种类型的文件。作为GUI框架,我正在使用wxWidgets。wxImage并绘制原始rgb字节

所以我有纯RGB字节数组,对wxImage构造准备

wxImage(int width, int height, unsigned char* data, bool static_data = false). 

问题是,当我将它转换为wxBitmap并绘制成直流电它忽视RGB值平局只有黑色的画面。我真的不知道可能是什么问题。这是我画的图像代码:

DrawImage(wxDC &dc) 
{ 
    BYTE *rgbArray = bmpFile->GetRGB(); 
    wxSize imageSize = wxSize(bmpFile->GetSize().w,bmpFile->GetSize().h); 
    wxImage image = wxImage(imageSize, &rgbArray); 
    wxBitmap bitmap = wxBitmap(image); 
    dc.DrawBitmap(bitmap,5,5, false); 
} 

这是油漆事件:

void OnPaint(wxPaintEvent& event) 
{ 
    wxAutoBufferedPaintDC dc(canvas); 
    dc.SetBackground(wxBrush(canvas->GetBackgroundColour())); 
    dc.Clear(); 
    DrawImage(dc); 
} 

rgbArray充满了正确的价值观,我多次检查了它。

感谢所有帮助:)

回答

1

那是因为你可能调用这个函数,因为你传递一个BYTE **。

wxImage (const wxSize &sz, bool clear=true) 

调用其他重载,移除&可能有助于

wxImage image = wxImage(imageSize, rgbArray); 

为了使代码异常安全,就必须稍微改写。我不知道bmpFile是否返回一个新的缓冲区或指向它自己的数据缓冲区的指针。如果它没有返回一个新的缓冲区,那么你必须制作你自己的副本,因为wxImage取得了缓冲区的所有权。看到wxImage

DrawImage(wxDC &dc) 
{ 
    wxSize imageSize = wxSize(bmpFile->GetSize().w,bmpFile->GetSize().h); 
    wxImage image = wxImage(imageSize, bmpFile->GetRGB()); 
    wxBitmap bitmap = wxBitmap(image); 
    dc.DrawBitmap(bitmap,5,5, false); 
} 

DrawImage(wxDC &dc) 
{ 
    std::unique_ptr<BYTE> rgbData(bmpFile->GetRGB()); 
    wxSize imageSize = wxSize(bmpFile->GetSize().w,bmpFile->GetSize().h); 
    wxImage image = wxImage(imageSize, rgbData.release())); 
    wxBitmap bitmap = wxBitmap(image); 
    dc.DrawBitmap(bitmap,5,5, false); 
} 
+0

好吧,这是卓有成效的,多么愚蠢的错误,感谢帮助:) – eXPi 2013-02-16 14:30:47