Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поворот изображения, Медленно работает 
:(
    Опции темы
Loki_
  Дата 9.1.2004, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.10.2003

Репутация: нет
Всего: нет



Подскажите, как реализовать более быстрый способ поворота картинки?
Этот слишком долго работает(если картинка большая)


var x, y: integer;
r: single;
xo, yo: integer;
s, c: extended;
BitmapOriginal,BitmapRotate:TBitmap;
begin
BitmapOriginal:=TBitmap.Create;
BitmapOriginal.LoadFromFile('C:\Test.bmp');
BitmapRotate:=TBitmap.Create;
BitmapRotate.Width:=BITMAPORIGINAL.Width;
BitmapRotate.Height:=BITMAPORIGINAL.Height;
xo:=BITMAPORIGINAL.Width div 2;
yo:=BITMAPORIGINAL.Height div 2;
a := a+0.05;
for y:=0 to BITMAPORIGINAL.Height - 1 do
begin
for x:=0 to BITMAPORIGINAL.Width - 1 do
begin
r:=sqrt(sqr(x - xo) + sqr(y - yo));
SinCos(a + arctan2((y - yo), (x - xo)), s, c);
Form1.BitmapRotate.Canvas.Pixels[x,y]:=Form1.BITMAPORIGINAL.Canvas.Pixels[
round(xo + r * c), round(yo + r * s)];
end;
end;
Form2.Image1.Canvas.Draw(0,0,Form1.BitmapRotate);
end;
PM MAIL   Вверх
Unregistered
Дата 9.1.2004, 03:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Тормозит, потому что ты внутри двойного цикла считаешь
несколько левых функций типа sqrt() или arctan2() или SinCos(), что делать совсем не обязательно,
так как на их исполнение тратится слишком много времени

Чтобы повернуть изображение, достаточно знать всего лишь синус и косинус угла поворота
Причем угол поворота не зависит от каждой конкретной точки изображения, поэтому
этот синус и косинус можно сосчитать вне цикла, тогда работать будет намного быстрее
  Вверх
val
Дата 9.1.2004, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: 1
Всего: 7



Где-то уже была тема поворота...
Повторюсь:
Ynew=Y*sin(alpa);
Xnew=X*cos(alpa);
alpha - угол, на который поворачиваем...
При этом, желательно, иметь подготовленными таблицы sin и cos. Тогда всё должно ускориться...



--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
maxim1000
Дата 9.1.2004, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



а поворачивают вообще-то не так
так изображение получается размазанное
насколько я знаю алгоритм поворота строится на основе операции "скашивания" (не знаю, как правильно это называется):
(x,y)->(round(x+a*y),y) (по горизонтали)
(x,y)->(x,round(y+b*y)) (по вертикали)
сам алгоритм строится как композиция нескольких скашиваний:
1. по горизонтали с коэффициентом a
2. по вертикали с коэффициентом b
3. по горизонтали то ли с a, то ли с (-a)
коэффициенты a и b вычисляются из значения угла поворота


--------------------
qqq
PM WWW   Вверх
maxim1000
Дата 9.1.2004, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
Ynew=Y*sin(alpa);
Xnew=X*cos(alpa);
alpha - угол, на который поворачиваем...

не совсем так:

xnew=x*cos(alpha)+y*sin(alpha);
ynew=-x*sin(alpha)+y*cos(alpha);


--------------------
qqq
PM WWW   Вверх
Unregistered
Дата 14.1.2004, 10:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если ещё ускорять, то забудь про pixels[] и работай со scanline... всё ускорится в несколько раз...
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.