wxImage и рисует необработанные байты RGB

Я программирую программу просмотра изображений как школьное задание, и я не могу использовать любые библиотеки для чтения или манипулирования изображениями. Сначала я начал с формата 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 заполнен правильными значениями, я проверял это несколько раз.

Спасибо за любую помощь 🙂

0

Решение

Это потому, что вы, вероятно, вызываете эту функцию, потому что вы передаете 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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector