SetWorldTransform() некорректно отрабататывает для большого рисунка. #677886


#0 by H A D G E H O G s
Дня доброго. Это тема про Delphi. Конечно малореально, нуавдруг кто-то юзал. Нужно развернуть рисунок (точечный) на угол. SetWorldTransform великолепно его крутит, масштабирует, но когда я пытаюсь повернуть 60 мегабайтный bmp (10 метров в jpg) - он (вернее функция копирования в трансформированный Canvas BitBlt) работает криво - по результату у меня белое полотно вместо рисунка. В тоже время масштабирование осуществляется на ура. Пока поворот запилил через ScanLine, но он в 1.5-2 раза медленнее, чем через SetWorldTransform (2.5 секунд для 10 метров jpg).
#1 by H A D G E H O G s
Кот: 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 by H A D G E H O G s
Так, счаст попробуем без всяких копирований через ModifyWorldTransform
#3 by H A D G E H O G s
Фигню сморозить. ModifyWorldTransform - это тупо добавочное преобразование/сброс "мирового" пространства.
#4 by H A D G E H O G s
Подниму темку, нуавдруг.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С