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;
|
|