Russian Qt Forum

Qt => Мультимедиа => Тема начата: DeMoren от Март 28, 2010, 14:07



Название: [РЕШЕНО]Как раскрасить монохромное изображение
Отправлено: DeMoren от Март 28, 2010, 14:07
Доброе время суток.
Появилась необходимость раскрасить монохромное изображение (png с альфа-каналом), загруженное в QPixmap каким-либо цветом.
Собственно вопрос: есть ли для этого какие-либо готовые методы, или нужно самому каждый пиксель красить?


Название: Re: Как раскрасить монохромное изображение
Отправлено: ieroglif от Март 28, 2010, 15:39
Код:
for ( int i=0; i< image.width(); i++ ) {
  for ( int j=0; j<image.height(); j++ ) {
    image.setPixel(бла бла бла);
  }
}


Название: Re: Как раскрасить монохромное изображение
Отправлено: DeMoren от Март 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).

Но эта реализация как-то медленновато работает... каким образом ее можно оптимизировать?


Название: Re: Как раскрасить монохромное изображение
Отправлено: DeMoren от Март 28, 2010, 16:33
Уточнение насчет быстродействия:
пнг-картинка размером 40х40 пикселей. 2 устройства:
1. ноут (DualCore 1.8GHz) - 80мс в среднем.
2. nokia 5530 (ARM11 434MHz) - 450мс в среднем.


Название: Re: Как раскрасить монохромное изображение
Отправлено: DeMoren от Март 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мс в среднем


Название: Re: [РЕШЕНО]Как раскрасить монохромное изображение
Отправлено: Авварон от Март 28, 2010, 23:22
во первых у тебя течет память, во вторых создание на стеке быстрее, в третьих зачем вообще каждый раз создаваать QColor


Название: Re: [РЕШЕНО]Как раскрасить монохромное изобр&
Отправлено: Marat(Qt) от Апрель 15, 2010, 01:53
А compositionmode не позволяет подкрашивать? Source atop например?