Построение QImage из данных без знака char * - PullRequest
4 голосов
/ 27 октября 2010

Я столкнулся с проблемой при передаче объекта Image (захваченного с помощью Point Grej FlyCapture2 SDK) в объект QImage. Я получаю указатель, связанный с данными изображения по функции:

virtual unsigned char* FlyCapture2::GetData  (   ) 

и затем загрузка данных по:

QImage::QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )

Форматы данных обоих объектов Image являются 8-битными одноцветными. Параметр BytesPerLine должен быть равен ширине изображения (я уже проверил его, сохранив FlyCapture2 :: Image в .bmp и затем загрузив его в QImage).

Считаете ли вы, что проблема заключается в приведении типа unsigned char * к uchar *? У тебя есть другие идеи? Копирование изображения пиксель за пикселем происходит слишком медленно.

EDIT: я конвертирую изображение, захваченное FlyCapture, в FlyCapture2::PIXEL_FORMAT_RGB8, для которого: R = G = B = 8 бит, в функции PGR::SnapShot(). SnapShot () возвращает unsigned char* const. и вот часть моей функции отображения Qt:

unsigned char *const img = PGRSystem->SnapShot();
QImage Img(img, 1024, 768, QImage::Format_RGB888);
QGraphicsScene *Scene = new QGraphicsScene();
Scene->addPixmap(QPixmap::fromImage(Img));
ui.ImageView->setScene(Scene);
ui.ImageView->fitInView(ui.ImageView->itemAt(100,100));
delete [] Scene;

Я также пытался сохранить Img в файл, но затем получил необработанное исключение. Я пробовал другие пары форматов пикселей (FlyCapture2::PIXEL_FORMAT_RGB - 24-битный RGB с QImage::RGB88 8 и FlyCapture2::PIXEL_FORMAT_RGBU32 с QImage::RGB32)

Также стоит упомянуть, что используемый мной конструктор QImage не устанавливает colorTable (я получаю исключение при проверке, находится ли QImage в grayScale). Мне нужно немного больше помощи, я думаю.

Ответы [ 2 ]

5 голосов
/ 27 октября 2010

Во-первых, QImage не поддерживает собственное изображение в градациях серого, которое звучит так, как будто вы получаете его в качестве выходных данных, поэтому мне было бы любопытно, какой аргумент Format вы используете.Вероятно, самым простым решением, хотя и неэффективным с памятью, будет расширение изображения в градациях серого до RGB путем копирования каждого значения три раза (в новый QByteArray).

Еще одна проблема заключается в том, что конкретный конструктор QImage, который вы используетеиспользуя, не копирует лежащие в основе данные, поэтому вы должны быть уверены, что указатель, возвращенный из GetData (), переживает QImage - или заставить QImage сделать копию внутри, используя, скажем, QImage :: copy.

Видение большего количества кода поможет, как отмечали другие респонденты выше.

1 голос
/ 28 октября 2010

Большое спасибо за вашу помощь, вы были правы насчет форматов изображений. К сожалению, основная проблема была связана с передачей указателя между функциями. В PGR :: SnapShot () я создавал FlyCapture2 :: Image, а затем получал указатель на данные. FlyCapture2 :: Изображение было повреждено при выходе из функции, поэтому возвращаемый указатель был BadPtr.

...