![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 30.06.2012
Сообщений: 145
|
![]()
Доброго времени суток, уважаемые эксперты. У меня стоит задача создать алгоритм поворота изображения на заданный угол в делфи. Но желательно без подключения дополнительных библиотек (все стандартными средствами). Алгоритм должен вместиться в одну процедуру, чтобы не нужно было еще дополнительно прописывать какие-то константы или классы, записи вне процедуры. Заданный угол может быть абсолютно любым. Скорость работы такого алгоритма мне не важна - подойдет даже очень медленный. Я вот знаю можно к пикселям добраться через TBitmap.Pixels[i,j], но я никак не могу подобрать формулу которая бы могла нормально (без искажения) повернуть изображение. Например поворот на 90 градусов я делаю так:
var X,Y,C: uint; begin for X:=0 to image1.picture.width-1 do begin for Y:=0 to image1.picture.Height-1 do begin C:=image1.Canvas.Pixels[x,y]; image2.Canvas.Pixels[Y,X]:=C; end; А вот если я начинаю добавлять в формулу синусы, косинусы и угол то при повороте изображение очень сильно начинает страдать: procedure IMGRotate(IMG:TBitmap; Angle:single); var X,Y,Cell: uint; buf:TBitmap; x0,y0:Integer; //center katrinki r:Single; sinus, cosinus: Extended; begin Buf:=TBitmap.Create; Buf.Width:=IMG.Height; Buf.Height:=IMG.Width; //x0:=0; y0:=0; x0 := img.Width div 2; y0 := img.Height div 2; Angle:=1; for X:=0 to IMG.width-1 do begin for Y:=0 to IMG.Height-1 do begin r := sqrt(sqr(X - x0) + sqr(Y - y0)); SinCos(angle + arctan2((y - y0), (x - x0)), sinus, cosinus); Buf.Canvas.Pixels[x,y]:=img.Canvas.Pixels[round(x0+r*cosinus), round(y0+r*sinus)]; if (Buf.Canvas.Pixels[x,y]=clWhite) then Buf.Canvas.Pixels[x,y]:=Buf.TransparentColor; end; end; IMG.Canvas.Draw(0,0,Buf); Buf.FreeImage; Buf.Free; end; Можно ли подправить мой алгоритм или хотя бы подобрать формулу по которой можно было бы нормально пиксели расставить при поворотах. Я нашел кучу информации, но это или с помошью дополнительных библиотек или куча процедур вместо одной или нужно вне процедуры обьявлять что-то. Заранее спасибо. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 02.03.2008
Сообщений: 2,499
|
![]()
Ну, рисовать по пикселам - это моветон.
Лучше используйте методы Канвы - LineTo, MoveTo. Например, создайте процедуру рисования прямоугольника по заданным вершинам v1,v2,v3,v4: Код:
Код:
Последний раз редактировалось type_Oleg; 15.06.2014 в 19:45. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 30.06.2012
Сообщений: 145
|
![]()
Спасибо за совет. Неплохой вариант. Но вот с расчетами у меня как раз и проблемы. Я не могу формулу подобрать.
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 02.03.2008
Сообщений: 2,499
|
![]()
Вот, построение прямоугольника, это конечно проще поворота.
Код:
Имеем точки A, B , надо повернуть на alpha точку B вокруг точки A. Координаты, синусы, косинусы. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 30.06.2012
Сообщений: 145
|
![]()
Ну построить и отобразить прямоугольник - это не проблема. Повернуть изображение на 90 или 180 градусов тоже. Но когда нужно повернуть на произвольный угол типа на 1 градус или 6 градусов - изображение по моему алгоритму поворачивается, но изображение начинает размываться, а значит алгоритм не правильный. Ладно, если никто ничего не посоветует по поводу формул - буду сам пытаться выводить их. Просто уже 2 суток на это потратил. В любом случае благодарен тебе за советы - я их приму во внимание. Еще раз спасибо.
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 02.03.2008
Сообщений: 2,499
|
![]()
Держите. Работает. На рисунке - результат одного клика на Батон1, и трех - на Батон2. На форму кроме Батонов положите еще Image.
Дорабатывайте для того, чтобы вводить начальные координаты, угол поворота ... Код:
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 30.06.2012
Сообщений: 145
|
![]()
Огромное спасибо! Дальше, думаю разберусь. Главное, что есть формулы поворота вокруг точки.
|
![]() |
![]() |
![]() |
#8 |
Заблокирован
Регистрация: 02.03.2014
Сообщений: 439
|
![]()
type_Oleg А если нужно повернуть картинку?
|
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 02.03.2008
Сообщений: 2,499
|
![]()
Да, у меня только поворот 4-угольника. Я написал прямоугольник, на самом деле любой 4-угольник.
А вообще, любую растровую картинку - да, наверное только через пикселы. Пусть использует функцию fRotatV2 Только надо удалять старое изображение сначала |
![]() |
![]() |
![]() |
#10 |
Заблокирован
Регистрация: 02.03.2014
Сообщений: 439
|
![]()
Тогда предложу такой вариант
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поворот изображения | Sanya.Kushner | Мультимедиа в Delphi | 1 | 29.12.2013 19:59 |
поворот изображения на форме (либо поворот файла с картинкой) | mystiql | Microsoft Office Access | 2 | 21.06.2011 22:03 |
поворот изображения | DeDoK | Общие вопросы Delphi | 4 | 06.09.2010 21:34 |
Поворот изображения | Djony_91 | Мультимедиа в Delphi | 1 | 26.05.2010 16:15 |
поворот изображения | Пепел Феникса | Мультимедиа в Delphi | 1 | 21.06.2009 19:53 |