wxImage并绘制原始rgb字节

时间:2013-02-16 13:17:38

标签: c++ drawing wxwidgets

我将图像查看器编程为学校任务,我无法使用任何库来阅读或操作图像。首先我开始使用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填充了正确的值,我多次检查它。

感谢您的帮助:)

1 个答案:

答案 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);
}