![]() |
![]() |
![]() |
|
SetWorldTransform() некорректно отрабататывает для большого рисунка. | ☑ | ||
---|---|---|---|---|
0
H A D G E H O G s
22.08.13
✎
12:13
|
Дня доброго.
Это тема про Delphi. Конечно малореально, нуавдруг кто-то юзал. Нужно развернуть рисунок (точечный) на угол. SetWorldTransform() великолепно его крутит, масштабирует, но когда я пытаюсь повернуть 60 мегабайтный bmp (10 метров в jpg) - он (вернее функция копирования в трансформированный Canvas BitBlt()) работает криво - по результату у меня белое полотно вместо рисунка. В тоже время масштабирование осуществляется на ура. Пока поворот запилил через ScanLine, но он в 1.5-2 раза медленнее, чем через SetWorldTransform() (2.5 секунд для 10 метров jpg). |
|||
1
H A D G E H O G s
22.08.13
✎
12:13
|
Кот:
function T_vk_object.Rotate(FromBitmap:TBitmap;Angle:real):TBitmap; function Min(const A,B:extended):extended; begin if A<B then Result:=A else Result:=B; end; function Max(const A,B:extended):extended; begin if A>B then Result:=A else Result:=B; end; function Ceil(const X:extended):Integer; begin Result:=Integer(Trunc(X)); if Frac(X)>0 then Inc(Result); end; var xform:TXFORM; vfRradians,vfCosinus,vfSinus,vfPoint1x,vfPoint1y,vfPoint2x,vfPoint2y,vfPoint3x,vfPoint3y:extended; vfMinx,vfMiny,vfMaxX,vfMaxY:extended; ToBitmapWidth,ToBitmapHeight:Integer; begin Result:=TBitmap.Create; vfRradians:=(2*3.141592653589793238462643383279*Angle)/360; vfCosinus:=cos(vfRradians); vfSinus:=sin(vfRradians); vfPoint1x:=(-FromBitmap.Height*vfSinus); vfPoint1y:=(FromBitmap.Height*vfCosinus); vfPoint2x:=(FromBitmap.Width*vfCosinus-FromBitmap.Height*vfSinus); vfPoint2y:=(FromBitmap.Height*vfCosinus+FromBitmap.Width*vfSinus); vfPoint3x:=(FromBitmap.Width*vfCosinus); vfPoint3y:=(FromBitmap.Width*vfSinus); vfMinx:=Min(0,Min(vfPoint1x,Min(vfPoint2x,vfPoint3x))); vfMiny:=Min(0,Min(vfPoint1y,Min(vfPoint2y,vfPoint3y))); vfMaxX:=Max(vfPoint1x,Max(vfPoint2x,vfPoint3x)); vfMaxY:=Max(vfPoint1y,Max(vfPoint2y,vfPoint3y)); ToBitmapWidth:=Ceil(vfMaxX-vfMinx); ToBitmapHeight:=Ceil(vfMaxY-vfMiny); Result.Width:=ToBitmapWidth; Result.Height:=ToBitmapHeight; xform.eM11:=vfCosinus; xform.eM12:=vfSinus; xform.eM21:=-vfSinus; xform.eM22:=vfCosinus; xform.eDx:=-vfMinx; xform.eDy:=-vfMiny; SetGraphicsMode(Result.Canvas.Handle,GM_ADVANCED); SetWorldTransform(Result.Canvas.Handle,xform); BitBlt(Result.Canvas.Handle,0,0,FromBitmap.Width,FromBitmap.Height,FromBitmap.Canvas.Handle,0,0,SRCCOPY); end; |
|||
2
H A D G E H O G s
22.08.13
✎
12:19
|
Так, счаст попробуем без всяких копирований через
ModifyWorldTransform() |
|||
3
H A D G E H O G s
22.08.13
✎
12:45
|
Фигню сморозить.
ModifyWorldTransform() - это тупо добавочное преобразование/сброс "мирового" пространства. |
|||
4
H A D G E H O G s
23.08.13
✎
16:26
|
Подниму темку, нуавдруг.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |