[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / C - C++ /

Программное вращение изображений

Данная статья посвящена методике поворачивания изображений на заданный программистом угол. Решение этой задачи не так тривиально, как может показаться на первый взгляд.

Особенно если учитывать тот факт, что пиксель (наименьшая составляющая изображения) на самом деле не является точкой. Если быть точным, то это квадрат со сторонами 1х1. Исходя из этого можно сформулировать алгоритм, с помощью которого и можно реализовать вращение.

Представим, что изображение - это матрица пикселей. Тогда при вращении изображения происходит наложение исходной матрицы и повернутой на заданный угол. А поскольку единичный пиксель может быть только одного определенного цвета, то необходимо правильно распределить эти самые цвета.

Далее, чтобы хоть как-то разбавить "сухую" теорию, представлена ее графическая интерпретация. На левом рисунке представлено исходное изображение. На среднем рисунке видно, как происходит пересечение матриц исходного и повернутого изображений. Справа виден конечный результат работы алгоритма - происходит пропорциональное распределение цветов по ячейкам пиксельной матрицы.

результат работы алгоритма

Но в каждой бочке меда, как говорится, непременно найдется ложка дегтя. Данный алгоритм работает довольно медленно, поэтому и не годится для использования, например, в программировании компьютерных игр. Далее приведена реализация алгоритма на С++ (полностью исходные коды прилагаются в архиве).

Также можно сравнить результаты вращения рисунка с помощью нашего алгоритма и программы 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), то работа алгоритма будет немедленно завершена. Естественно, после того, как очистится память.

Файлы к статье

  • Compare.zip - сравнение вращения изображения в Photoshop и с помощью нашего алгоритма.
  • C++ Example.rar - архив с файлами исходных кодов к статье (aarot.hpp и driver.cpp)



  • Комментарии

     Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



    Последние статьи: Программирование под ОС / C - C++ /

    Пишем CD проигрыватель 2
    28-05-2010   

    Сейчас я покажу как можно написать простой проигрыватель CD дисков. Для начала разместим все нужные компоненты на форме (см. рисунок)... подробнее

    Кол. просмотров: общее - 5126 сегодня - 1

    Пишем браузер
    28-05-2010   

    Продолжаю тему клонирования программ darkamstera на Delphi в С++Builder. В этой статье я покажу, как с помощью стандартных компонентов, можно создать свой браузер. Браузер будет на движке всеми-любимого InternetExplorer. Наш зверь сможет ходить по URL... подробнее

    Кол. просмотров: общее - 3907 сегодня - 0

    Информация о системе
    28-05-2010   

    Выводим информацию о нашей родненькой системе. Для получения большей части информации мы будем использовать обширные функции, это не так сложно, как может показатся с первого взгляда и вообще код довольно простой и примитивный, так что покапавшись в нем пару минут - можно в легкостью разобраться что к чему, зачем и как... подробнее

    Кол. просмотров: общее - 3708 сегодня - 0

    FTP клиент своими руками
    28-05-2010   

    Здраствуй, сечас я покажу, как в CBuilder можно создать свой простой FTP-клиент, похожий пример можно найти в документации C++Builder Developnets Guilde... подробнее

    Кол. просмотров: общее - 4493 сегодня - 0

    Работаем с POP-сервером
    28-05-2010   

    Здраствуй, в этой статье я расскажу про способы получения e-mail писем и их прочтения. Для начала давайте составим интерфейс будущей программы Вот, что у меня вышло... подробнее

    Кол. просмотров: общее - 3782 сегодня - 0



      WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects