Const
  MaxPixelCount = 32768;
Type
  TRGBTripleArray = ARRAY[0..MaxPixelCount-1] of TRGBTriple;
  pRGBTripleArray = ^TRGBTripleArray;
function RotateBitmapMethod1 (CONST BitmapOriginal: TBitmap; CONST iRotationAxis, jRotationAxis: INTEGER; CONST AngleOfRotation: DOUBLE):TBitmap;
var
THETA:DOUBLE;
cosTheta, sinTheta : extended;
i,j,iOriginal,jOriginal,iPrime,jPrime: integer;
RowOriginal, RowRotated: pRGBTRipleARRAY;
begin
  Result:=Tbitmap.create;
  Result.Width:= BitmapOriginal.Width;
  Result.Height:=BitmapOriginal.Height;
  Result.PixelFormat:=pf24bit;
  Theta := pi/180*ANGLEoFrOTATION;
  sincos(theta, sintheta, costheta);
  for j := Result.Height-1 downto 0 do
    begin
      RowRotated:=Result.ScanLine[j];
      jPrime:= 2*(j-jRotationAxis)-1;
      for i := result.Width-1 downto 0 do
        begin
          iPrime := 2*(i-iRotationAxis)-1;
          iOriginal := (Round(iprime*Costheta-jprime*sintheta)-1)div 2 + iRotationAxis;
          jOriginal := (Round(iprime*Sintheta+jprime*costheta)-1)div 2 + jRotationAxis;
          if (ioriginal>=0) AND (ioriginal <= Bitmaporiginal.width-1) AND (joriginal>=0) AND (joriginal<=Bitmaporiginal.height-1) then
          begin
            RowOriginal:= BitmapOriginal.ScanLine[joriginal];
            RowRotated[i]:=RowOriginal[ioriginal];
          end;
        end;
    end;
end;
			
		
 
	
Partager