Russian Qt Forum
Ноябрь 24, 2024, 09:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вывести массив пикселей на экран  (Прочитано 6202 раз)
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« : Апрель 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-буфера)
« Последнее редактирование: Апрель 08, 2011, 20:56 от Torvald » Записан
Kolobok
Гость
« Ответ #1 : Апрель 08, 2011, 21:04 »

QImage
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #2 : Апрель 09, 2011, 12:34 »

Блииин Смеющийся А слона то я и не приметил. Есть же еще QImage)
Спасибо большое!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 23.