Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поворот Bitmap - а


Страницы:   1 2

chuckloon ©   (2003-10-22 17:16:00) 

Я загрузил Bitmap в TBitmap. Подскажите алгоритм или библиотечку для быстрого поворота его на произвольный угол.


Sergio Bassy   (2003-11-24 13:41:00) [21]

а ещё есть хорошая библиотека для работы с изображениями: IPL2
(Image Processing Library - Библиотека обработки изображений)
Поворот, преобразования Фурье (прямое и обратное), и прочее...


Sergio Bassy   (2003-11-24 13:39:00) [22]

sedtDC и srcDC - это дескрипторы контекста устройства (Device Context) или просто хэндл соответственно куда рисовать и источника рисунка.

получают их с помощью GetDC()


Micah'GF   (2003-11-23 20:31:00) [23]

ээээ... вроде немного разобрался... подключил модуль windows и заработало..
НО!
sedtDCи srcDCдолжно быть чем?!?! (незнаю как подругому сформулировать вопрос)

sDC := sDIB.Canvas.Handle;
dDC := GetDC(dDIB.Canvas.Handle);  <<< здесь говорят что Canvas does not allow drawing
result := PlgBlt(dDC, Points, sDC, 0,0, sDIB.Width, sDIB.Height,0,0,0);


а хочется всего то из sDIB повернуть растр и поместить в dDIB..
приведи пример если не трудно.


Micah'GF   (2003-11-23 19:56:00) [24]

=> [10] марсианин  
подскажи, плиз, как правильно PlgBlt объявить !?!?!? в хелпе даже по BitBlt ничего не нашел...
в инете нашел только для Си
BOOL PlgBlt(HDC hdcDest, CONST POINT *lpPoint, HDC hdcSrc, int nXSrc, int nYSrc, int nWidth, int nHeight, HBITMAP hbmMask, int xMask, int yMask );
как это в Дельфях написать?!?


miek   (2003-11-23 09:45:00) [25]

2F: Заменяется это все линиями по Брезенхэму. Сложение, вычитание, сравнение. Учись, студент.


MBo   (2003-11-23 07:57:00) [26]

>Как же заменить вот это:
>сложение и вычитанием?
В выражениях много констант, меняется только то, что в скобках, причем линейно при движении по строке - xOld на единицу. Вот и преобразуй.


Fenik   (2003-11-22 23:08:00) [27]

>miek ©  (25.10.03 21:38) [11]

Как же заменить вот это:

MBo ©  (22.10.03 17:28) [1]
xNew:=xC+(xOld-xC)*cos(fi)+(yOld-yC)*sin(fi)
yNew:=yC-(xOld-xC)*sin(fi)+(yOld-yC)*cos(fi)

сложение и вычитанием?


miek   (2003-10-25 21:38:00) [28]

2Fenik:
>В смысле, не на асме?
>Как можно оптимизировать?

Асм ни при чем, хотя помогает немного выиграть.

Главное - чтобы в основном цикле были только сложение и вычитание. На худой конец - сдвиги. И никакой плавающей точки.
Вот тогда - да, оптимизировано.


марсианин   (2003-10-25 04:55:00) [29]

2Вилис  (24.10.03 08:26) [6]

в хелпе глянь. лежит в gdi32.dll кажись. т.е. из набора стандартных ф-ий

код примерно такой

var Points:array[0..2,0..1] of integer;

w2 := srcWidth div 2; h2 := srcHeight div 2;

Points[0][0] := Round(-w2*Cos(angle) - h2*Sin(angle) + x0);
Points[0][1] := Round(-w2*Sin(angle) + h2*Cos(angle) + y0);

Points[1][0] := Round(-w2*Cos(angle) + -h2*Sin(angle) + x0);
Points[1][1] := Round(-w2*Sin(angle) - h2*Cos(angle) + y0);

Points[2][0] := Round( w2*Cos(angle) - h2*Sin(angle) + x0);
Points[2][1] := Round( w2*Sin(angle) + h2*Cos(angle) + y0);

PlgBlt(destDC, Points, srcDC, 0,0,srcWidth,srcHeight,0,0,0);


sin и cos надо только 1 раз посчитать а не 3
х0,у0 - координаты центра


Fenik   (2003-10-25 00:17:00) [30]

> miek ©  (23.10.03 23:52) [4]
> 2Mihey: Там неоптимизировано.


В смысле, не на асме?
Как можно оптимизировать?


Mihey   (2003-10-24 15:45:00) [31]

Тогда Graphic32.


MacroDenS   (2003-10-24 13:24:00) [32]

еще в кладовку я что-то подобное видел, вращения, там прозрачность.... полазь посмотри


Вилис   (2003-10-24 08:26:00) [33]

2 марсианин
Что за ф-ия и где она лежит?!


марсианин   (2003-10-24 01:37:00) [34]

FastLib умеет неплохо вращать, можно посмотреть исходник
еще есть такая апишная ф-ция PlgBlt. она может делать многое в т.ч. вращать.


miek   (2003-10-23 23:52:00) [35]

2Mihey: Там неоптимизировано.


Mihey   (2003-10-23 20:29:00) [36]

http://delphibase.endimus.ru/?action=viewfunc&topic=mediaimg&id=10186


miek   (2003-10-23 20:14:00) [37]

В моем SpriteUtils есть быстрый, но неряшливый (некрасиво выглядит на углах, далеких от кратным 45) алгоритм. Правда, все заточено для KOL.


MBo   (2003-10-22 17:28:00) [38]

xNew:=xC+(xOld-xC)*cos(fi)+(yOld-yC)*sin(fi)
yNew:=yC-(xOld-xC)*sin(fi)+(yOld-yC)*cos(fi)

лучше для каждой точки нового повернутого битмапа находить соотв. точку исходного


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо