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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Как раскрасить монохромное изображение  (Прочитано 5048 раз)
DeMoren
Гость
« : Март 28, 2010, 14:07 »

Доброе время суток.
Появилась необходимость раскрасить монохромное изображение (png с альфа-каналом), загруженное в QPixmap каким-либо цветом.
Собственно вопрос: есть ли для этого какие-либо готовые методы, или нужно самому каждый пиксель красить?
« Последнее редактирование: Март 28, 2010, 19:12 от DeMoren » Записан
ieroglif
Гость
« Ответ #1 : Март 28, 2010, 15:39 »

Код:
for ( int i=0; i< image.width(); i++ ) {
  for ( int j=0; j<image.height(); j++ ) {
    image.setPixel(бла бла бла);
  }
}
Записан
DeMoren
Гость
« Ответ #2 : Март 28, 2010, 15:58 »

Сделал таким образом:

Код:
QImage *image = new QImage(img->toImage());
    int hue = ui->horizontalSlider->value();
    int sat = ui->horizontalSlider_2->value();
    for (int i=0; i<image->width();i++)
    {
for (int j=0; j<image->height(); j++)
{

    QColor *col = new QColor( image->pixel(i,j) ); // почему то не учитывается альфа-канал
    QColor *alpha = new QColor( image->alphaChannel().pixel(i,j) );    // добавляю
    col->setAlpha(alpha->red());                                                  // альфа-канал
    col->setHsv(hue, sat, col->value(), col->alpha());
    image->setPixel(i,j, col->rgba());
}
    }

    *img = img->fromImage(*image);

заюзал перебор всех пикселов и HSV цветовую модель. (H - Hue, S - Saturation, V - Value).

Но эта реализация как-то медленновато работает... каким образом ее можно оптимизировать?
Записан
DeMoren
Гость
« Ответ #3 : Март 28, 2010, 16:33 »

Уточнение насчет быстродействия:
пнг-картинка размером 40х40 пикселей. 2 устройства:
1. ноут (DualCore 1.8GHz) - 80мс в среднем.
2. nokia 5530 (ARM11 434MHz) - 450мс в среднем.
Записан
DeMoren
Гость
« Ответ #4 : Март 28, 2010, 19:11 »

нашел решение и оформил в виде функции

Код
C++ (Qt)
void colorizePixmap(QPixmap *img, int hue, int sat) // HUE - [0..359], Saturation - [0.255]
{
   QImage *image = new QImage(img->toImage());
 
   for (int i = 0; i < image->width(); i++)
   {
for (int j = 0; j < image->height(); j++)
{
   QRgb rgb = image->pixel(i,j);
   QColor *col = new QColor(rgb);
   col->setAlpha(qAlpha(rgb));
   col->setHsv(hue, sat, col->value(), col->alpha());
   image->setPixel(i,j, col->rgba());
}
   }
 
   *img = img->fromImage(*image);
   delete image;
}


Быстродействие:
пнг 40х40 пикселей,
1. Windows 7, Intel DualCore 1.8 GHz - 2мс в серднем
2. Symbian S60v5, ARM11 434 MHz - 10мс в среднем
« Последнее редактирование: Март 28, 2010, 19:16 от DeMoren » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Март 28, 2010, 23:22 »

во первых у тебя течет память, во вторых создание на стеке быстрее, в третьих зачем вообще каждый раз создаваать QColor
Записан
Marat(Qt)
Гость
« Ответ #6 : Апрель 15, 2010, 01:53 »

А compositionmode не позволяет подкрашивать? Source atop например?
« Последнее редактирование: Апрель 15, 2010, 01:56 от Marat(Qt) » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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