Среда, 18.06.2025, 00:22
Приветствую Вас Гость | RSS
Меню сайта
fff
  • Индексация
  • Девочки
    Форма входа
    Категории раздела
    Теория алгоритмов [3]
    Теория алгоритмов
    Code Snippets [1]
    Code Snippets
    Все о PHP [20]
    Все о PHP
    Visual C++ [13]
    Visual C++
    WIN32 API [7]
    WIN32 API
    Delphi [72]
    Delphi
    ASP [2]
    ASP
    Java [67]
    Java
    VBScript [6]
    VBScript
    CGI [2]
    CGI
    VRML [2]
    VRML
    PERL [9]
    PERL
    HTML [4]
    HTML
    XML [10]
    XML
    Архив записей

    Статьи по Оптимизации

    ПРОГРАММИРОВАНИЕ! СОЗДАНИЕ САЙТОВ И ИХ ОПТИМИЗАЦИЯ

    Главная » Статьи » Программирование » Visual C++

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

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

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

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

    (увеличить рисунок)

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

    Также можно сравнить результаты вращения рисунка с помощью нашего алгоритма и программы Photoshop (CS2). Для тех, кому лень качать или медленный диал-ап smile приведу результат работы алгоритма:

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

    Категория: Visual C++ | Добавил: Merlin (07.12.2009)
    Просмотров: 879 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *: