代码如下:
procedure BitmapRotate(BMP: TBitmap; Angle: Double);
var
i, j, iRotationAxis, iOriginal, iPrime, iPrimeRotated, jRotationAxis, jOriginal,
jPrime, jPrimeRotated: Integer;
RowOriginal: pRGBArray;
RowRotated: pRGBArray;
Theta, sinTheta, cosTheta: DOUBLE;
R, G, B: byte;
FColor: TColor;
SavFormat: TPixelFormat;
BmpOrigin, BmpDest: TBitmap;
begin
BmpOrigin:=TBitmap.Create;
BmpDest:=TBitmap.Create;
BmpOrigin.Assign(BMP);
BmpDest.Width := BmpOrigin.Width;
BmpDest.Height := BmpOrigin.Height;
SavFormat := BmpOrigin.PixelFormat;
BmpOrigin.PixelFormat := pf24bit;
BmpDest.PixelFormat := BmpOrigin.PixelFormat;
iRotationAxis := BmpOrigin.Width div 2;
jRotationAxis := BmpOrigin.Height div 2;
Theta := Angle * PI / 180;
sinTheta := SIN(Theta);
cosTheta := COS(Theta);
FColor := BmpOrigin.Canvas.Pixels[0, 0];
B := FColor mod 256;
G := round((FColor div 256) mod 256);
R := round((FColor div 256) div 256); for j := BmpDest.Height - 1 downto 0 do
begin
RowRotated := BmpDest.Scanline[j];
jPrime := 2 * (j - jRotationAxis) + 1;
for i := BmpDest.Width - 1 downto 0 do
begin
iPrime := 2 * (i - iRotationAxis) + 1;
iPrimeRotated := ROUND(iPrime * CosTheta - jPrime * sinTheta);
jPrimeRotated := ROUND(iPrime * sinTheta + jPrime * cosTheta);
iOriginal := (iPrimeRotated - 1) div 2 + iRotationAxis;
jOriginal := (jPrimeRotated - 1) div 2 + jRotationAxis;
if (iOriginal >= 0) and (iOriginal <= BmpOrigin.Width - 1) and
(jOriginal >= 0) and (jOriginal <= BmpOrigin.Height - 1)
then
begin
RowOriginal := BmpOrigin.Scanline[jOriginal];
RowRotated[i] := RowOriginal[iOriginal]
end
else
begin
RowRotated[i].rgbtBlue := B;
RowRotated[i].rgbtGreen := G;
RowRotated[i].rgbtRed := R ;
end;
end;
end;
BmpOrigin.PixelFormat := SavFormat;
BmpDest.PixelFormat := BmpOrigin.PixelFormat;
image1.Picture.Bitmap.Assign(BmpDest);
BmpOrigin.Free;
BmpDest.Free;
end;已经在它赋值了pf24bit了呀。为什么呢???
procedure BitmapRotate(BMP: TBitmap; Angle: Double);
var
i, j, iRotationAxis, iOriginal, iPrime, iPrimeRotated, jRotationAxis, jOriginal,
jPrime, jPrimeRotated: Integer;
RowOriginal: pRGBArray;
RowRotated: pRGBArray;
Theta, sinTheta, cosTheta: DOUBLE;
R, G, B: byte;
FColor: TColor;
SavFormat: TPixelFormat;
BmpOrigin, BmpDest: TBitmap;
begin
BmpOrigin:=TBitmap.Create;
BmpDest:=TBitmap.Create;
BmpOrigin.Assign(BMP);
BmpDest.Width := BmpOrigin.Width;
BmpDest.Height := BmpOrigin.Height;
SavFormat := BmpOrigin.PixelFormat;
BmpOrigin.PixelFormat := pf24bit;
BmpDest.PixelFormat := BmpOrigin.PixelFormat;
iRotationAxis := BmpOrigin.Width div 2;
jRotationAxis := BmpOrigin.Height div 2;
Theta := Angle * PI / 180;
sinTheta := SIN(Theta);
cosTheta := COS(Theta);
FColor := BmpOrigin.Canvas.Pixels[0, 0];
B := FColor mod 256;
G := round((FColor div 256) mod 256);
R := round((FColor div 256) div 256); for j := BmpDest.Height - 1 downto 0 do
begin
RowRotated := BmpDest.Scanline[j];
jPrime := 2 * (j - jRotationAxis) + 1;
for i := BmpDest.Width - 1 downto 0 do
begin
iPrime := 2 * (i - iRotationAxis) + 1;
iPrimeRotated := ROUND(iPrime * CosTheta - jPrime * sinTheta);
jPrimeRotated := ROUND(iPrime * sinTheta + jPrime * cosTheta);
iOriginal := (iPrimeRotated - 1) div 2 + iRotationAxis;
jOriginal := (jPrimeRotated - 1) div 2 + jRotationAxis;
if (iOriginal >= 0) and (iOriginal <= BmpOrigin.Width - 1) and
(jOriginal >= 0) and (jOriginal <= BmpOrigin.Height - 1)
then
begin
RowOriginal := BmpOrigin.Scanline[jOriginal];
RowRotated[i] := RowOriginal[iOriginal]
end
else
begin
RowRotated[i].rgbtBlue := B;
RowRotated[i].rgbtGreen := G;
RowRotated[i].rgbtRed := R ;
end;
end;
end;
BmpOrigin.PixelFormat := SavFormat;
BmpDest.PixelFormat := BmpOrigin.PixelFormat;
image1.Picture.Bitmap.Assign(BmpDest);
BmpOrigin.Free;
BmpDest.Free;
end;已经在它赋值了pf24bit了呀。为什么呢???
MaxPixelCount = 32768;type
pRGBArray = ^TRGBArray;
TRGBArray = array[0..MaxPixelCount - 1] of TRGBTriple;是不是这样定义???