![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поворот Bitmap - а
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)
лучше для каждой точки нового повернутого битмапа находить соотв. точку исходного