Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Torvald от Апрель 08, 2011, 20:50



Название: Вывести массив пикселей на экран
Отправлено: Torvald от Апрель 08, 2011, 20:50
Здравствуйте) Возник вопрос, с которым самостоятельно никак не могу разобраться.
Имеется указатель на массив типа int:
Код:
int *a = new[this->width()*this->height()];
В нем я собираюсь хранить цвета пикселей. То есть a[23][468] - это цвет пикселя с позицией (23, 468).
Как бы мне его вывести на экран? Да чтоб разом и быстро и красиво)
Когда то давно я писал на билдере, там можно создать битмап а потом получить указатель на строчку пикселей в нем. Функция называлась scanline. Можно было работать с ним как с простым массивом, а потом в одну функцию отобразить на экране. Получалось как раз быстро, коротко и красиво.
Что я уже перепробовал в Qt:
Код:
void MainWindow::paintEvent(QPaintEvent *){
QPainter p;
p.begin(this);
p.setPen(QPen(QColor(rand()%16777000)));
//------------------------------------------------------------------------------------------------------- 1
for (int i=0; i<this->width(); i++)
for (int j=0; j<this->height(); j++){
p.drawPoint(i,j); // 360-430 ms
}
//------------------------------------------------------------------------------------------------------- 2
QPoint *points = new QPoint[this->width()*this->height()];
for (int i=0; i<this->width(); i++)
for (int j=0; j<this->height(); j++){
points[j*this->width()+i].setX(i);
points[j*this->width()+i].setY(j);
}
p.drawPoints(points, this->width()*this->height()); // 18-29 ms
//------------------------------------------------------------------------------------------------------- 3
QPixmap pxm(this->width(), this->height());
p.drawPixmap(0, 0, pxm); // <1 ms

p.end();
}
Кому лень разбираться в чужом коде, объясню:
В первом случае я заполняю экран по одному пикселю (drawPoint). Самый тупой метод, его я отбросил сразу, но до кучи решил добавить. Время заполнения экрана 1600х900 примерно  360-430 мс. Ужас.
Во втором случае я создаю указатель на массив точек, и вывожу на экран все эти точки разом (drawPoints). Результат конечно получше стал, но для интерактивной графики все равно не подходит. 18-29 мс.
Третий метод, на который я возлагал большие надежды - отрисовка пиксмапа (drawPixmap). Я так понял это один из самых примитивных классов для хранения растровой графики в Qt? Что то типа битмапа на билдере. В общем таймер показал 0 мс.

Но самое главное - как заполнить этот пихмап своими значениями? Можно как то получить от него указатель на массив пикселей? Как это вообще можно сделать в Qt? Хочется свободно изменять значения, а потом отображать их.

Кстати, это все для z-буфера)


Название: Re: Вывести массив пикселей на экран
Отправлено: Kolobok от Апрель 08, 2011, 21:04
QImage


Название: Re: Вывести массив пикселей на экран
Отправлено: Torvald от Апрель 09, 2011, 12:34
Блииин ;D А слона то я и не приметил. Есть же еще QImage)
Спасибо большое!