0

我正在将图像查看器编程为学校任务,我不能使用任何库来阅读或处理图像。首先,我从 bmp 格式开始。我创建了用于处理此类文件的类。作为 GUI 框架,我正在使用 wxWidgets。

所以我有普通的 rgb 字节数组,为 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 填充了正确的值,我检查了多次。

谢谢你的帮助 :)

4

1 回答 1

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);
}
于 2013-02-16T14:23:16.500 回答