0

私は学校の仕事として画像ビューアをプログラミングしていますが、画像を読んだり操作したりするためにライブラリを使用することはできません。まず、bmp形式から始めました。このタイプのファイルを処理するためのクラスを作成しました。GUIフレームワークとして、私はwxWidgetsを使用しています。

だから私はwxImageコンストラクターのために準備されたプレーンなrgbバイト配列を持っています

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 に答える