bei bildern allgemein wäre das prinzip eine horizontale linie lesen und vertical schreiben, dann die nächste horizonale linie lesen und vertical schreiben. Also eigentlich ganz simpel.
Hier das ganze mal als source (naja, paar zeilen sinds nicht nur aber es funzt)
Delphi-Quellcode:
procedure Rotate(ABmp: TBitmap);
var LBmp: TBitmap;
LCountX,
LCountY : Integer;
LPixDst,
LPixSrc : PRGBTriple;
LDif : Cardinal;
begin
ABmp.PixelFormat := pf24bit;
LBmp := TBitmap.Create;
LBmp.PixelFormat := pf24bit;
LBmp.Width := ABmp.Height;
LBmp.Height := ABmp.Width;
if LBmp.Height > 1 then
LDif := Cardinal(LBmp.ScanLine[1]) - Cardinal(LBmp.ScanLine[0])
else
LDif := 0;
for LCountY := 0 to ABmp.Height - 1 do
begin
LPixSrc := ABmp.ScanLine[LCountY];
LPixDst := Pointer(Cardinal(LBmp.ScanLine[0]) + Cardinal(LCountY) * SizeOf(TRGBTriple));
for LCountX := 0 to ABmp.Width - 1 do
begin
LPixDst^ := LPixSrc^;
LPixSrc := Pointer(Cardinal(LPixSrc) + SizeOf(TRGBTriple));
LPixDst := Pointer(Cardinal(LPixDst) + LDif);
end;
end;
ABmp.Assign(LBmp);
LBmp.Free;
end;