Представим, что изображение - это матрица пикселей. Тогда при вращении изображения происходит наложение исходной матрицы и повернутой на заданный угол. А поскольку единичный пиксель может быть только одного определенного цвета, то необходимо правильно распределить эти самые цвета.
Далее, чтобы хоть как-то разбавить "сухую" теорию, представлена ее графическая интерпретация. На левом рисунке представлено исходное изображение. На среднем рисунке видно, как происходит пересечение матриц исходного и повернутого изображений. Справа виден конечный результат работы алгоритма - происходит пропорциональное распределение цветов по ячейкам пиксельной матрицы.
(увеличить рисунок)
Но в каждой бочке меда, как говорится, непременно найдется ложка дегтя. Данный алгоритм работает довольно медленно, поэтому и не годится для использования, например, в программировании компьютерных игр. Далее приведена реализация алгоритма на С++ (полностью исходные коды прилагаются в архиве).
Также можно сравнить результаты вращения рисунка с помощью нашего алгоритма и программы Photoshop (CS2). Для тех, кому лень качать или медленный диал-ап, :) приведу результат работы алгоритма:
Поворот на 65°
Реализация
Прототип функции:
Код:
HBITMAP aarot::rotate(HBITMAP src, double rotation,
aar_callback callbackfunc, int bgcolor,
bool autoblend)
Аргументы функции:
* Scr: путь к исходному изображению
* Rotation: число градусов, на которые необходимо повернуть изображение (против часовой стрелки)
* callbackfunc (CallBackPtr): указатель на функцию callback. Эта функция следит за тем, на какой угол уже было повернуто изображение.
* BgColor: цвет фона, где вращаемое изображение не накладывается на исходное.
* AutoBlend: должны ли края вращаемого изображения быть смешанными с цветом фона, определенным в переменной BgColor?
Использование функции Callback
Данная фунцкия имеет следующий вид:
Код:
bool AarotCallbackFunc(double percentdone)
{
...
}
где percentdone - процент выполнения программы по вращению изображения (0 is 0%, 1 is 100% и т.д)
Если же ваша функция callback вернет true (что-нибудь, кроме 0), то работа алгоритма будет немедленно завершена. Естественно, после того, как очистится память.
Версия для печати
Рейтинг:
Комментарии отсутствуют



