История такая. В программе понадобился урезанный редактор для изображений, в котором есть ползунки, меняющие значение для гаммы, контраста и т.д. Обрабатываемые изображения имеют размер порядка 6000 на 4000 пикселей. Все бы ничего, но обработка, например, гаммы затягивается на пол секунды, но с некоторой хитростью сокращается вдвое. Например гамма:
QTime time;
time.start();
double gamma = 0.5;
double G = 1/gamma;
double preCalc[256];
for (int i = 0; i <= 255; i++)
{
preCalc[i] = pow((i / 255.0), G) * 255; // для ускорения просчитываем все заранее (чтобы не повторять это вычисление миллионы раз вместо 255)
}
for( int y = 0; y < tempImg.rows; y++ )
{
for( int x = 0; x < tempImg.cols; x++ )
{
for( int c = 0; c < 3; c++ )
{
tempImg.at<cv::Vec3b>(y,x)[c] =
cv::saturate_cast<uchar>( preCalc[tempImg.at<cv::Vec3b>(y,x)[c]] );
}
}
}
qDebug() << time.elapsed();
В результате, насчитывается 1/3 секунды. А представьте, добавим еще расчет яркости контрастности все... А фотошоп это изображение обрабатывает в реальном времени при изменении ползунка вне зависимости от масштаба. Я, конечно, не забываю, что ребята в ADOBE очень многое могут. Вопрос в том, какую хитрость они применили? Т.к. дело происходит на ноутбуке и я не уверен, что используется gpu.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей