Имя: Пароль:
IT
 
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
Подниму темку, нуавдруг.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший