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