我将图像查看器编程为学校任务,我无法使用任何库来阅读或操作图像。首先我开始使用bmp格式。我已经创建了类来处理这种类型的文件。作为GUI框架,我使用wxWidgets。
所以我有简单的rgb bytes数组,为wxImage构造函数
准备wxImage(int width, int height, unsigned char* data, bool static_data = false).
问题是,当我将它转换为wxBitmap并绘制到dc时,忽略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填充了正确的值,我多次检查它。
感谢您的帮助:)
答案 0 :(得分: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);
}