Kod: Tümünü seç
function RotateBmp(xSource: TBitmap; Aci: double): TBitmap;
var
cosTheta: DOUBLE;
Delta: DWORD; // D3/D4 compatibility
i: INTEGER;
iRotationAxis: INTEGER;
iOriginal: INTEGER;
iPrime: INTEGER;
iPrimeRotated: INTEGER;
j: INTEGER;
jRotationAxis: INTEGER;
jOriginal: INTEGER;
jPrime: INTEGER;
jPrimeRotated: INTEGER;
RowOriginal: pRGBArray;
RowRotated: pRGBArray;
sinTheta: DOUBLE;
StartTime: DWORD;
Theta: DOUBLE; // radians
dest: TBitmap;
source: Tbitmap;
begin
Dest := TBitmap.Create;
source := Xsource;
Source.PixelFormat := pf24bit;
Dest.PixelFormat := pf24bit;
dest.Width := Source.Width;
dest.Height := Source.Height;
iRotationAxis := Source.Width div 2;
JRotationAxis := Source.Height div 2;
Theta := -(aci) * PI / 180;
sinTheta := SIN(Theta);
cosTheta := COS(Theta);
for j := Dest.Height - 1 downto 0 do
begin
RowRotated := Dest.Scanline[j];
jPrime := 2 * (j - jRotationAxis) + 1;
for i := Dest.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 <= Source.Width - 1) and
(jOriginal >= 0) and (jOriginal <= Source.Height - 1)
then begin
RowOriginal := Source.Scanline[jOriginal];
RowRotated[i] := RowOriginal[iOriginal]
end
else begin
RowRotated[i].rgbtBlue := 255; // assign "corner" color
RowRotated[i].rgbtGreen := 255;
RowRotated[i].rgbtRed := 255;
end;
end;
end;
source.PixelFormat := pf1bit;
Dest.PixelFormat := pf1bit;
dest.SaveToFile('c:\cevrili.bmp');
REsult := Dest;
bu konuda daha önce bi çalışma yapan varmı acaba?
Teşk.