Hola,
Rotar píxel a píxel a mano es lento y da problemas de calidad (huecos, bordes irregulares). La forma habitual en Delphi es apoyarte en la API de Windows para que la propia GDI haga la rotación, usando una matriz de transformación:
uses Windows, Graphics;
function RotarBitmap(Origen: TBitmap; AnguloGrados: Double): TBitmap;
var
Radianes: Double;
Matriz: TXForm;
begin
Result := TBitmap.Create;
Result.Width := Origen.Width;
Result.Height := Origen.Height;
Radianes := AnguloGrados * PI / 180;
Matriz.eM11 := Cos(Radianes);
Matriz.eM12 := Sin(Radianes);
Matriz.eM21 := -Sin(Radianes);
Matriz.eM22 := Cos(Radianes);
Matriz.eDx := Origen.Width / 2;
Matriz.eDy := Origen.Height / 2;
SetGraphicsMode(Result.Canvas.Handle, GM_ADVANCED);
SetWorldTransform(Result.Canvas.Handle, Matriz);
Result.Canvas.Draw(-Origen.Width div 2, -Origen.Height div 2, Origen);
end;
SetWorldTransform es una función de la API gráfica de Windows (GDI) que aplica una matriz de transformación a todo lo que se dibuje después en ese Canvas, incluyendo rotación. La matriz que construyo (eM11, eM12, eM21, eM22) es la matriz de rotación estándar en trigonometría, y eDx/eDy desplazan el centro de rotación al medio de la imagen, para que rote sobre su propio centro en vez de sobre la esquina superior izquierda.
Uso:
var
BitmapRotado: TBitmap;
begin
BitmapRotado := RotarBitmap(MiImagen, 45);
Image1.Picture.Bitmap := BitmapRotado;
BitmapRotado.Free;
end;
Esto rota con el mismo algoritmo de interpolación que usa Windows internamente para cualquier transformación gráfica, mucho más rápido y con mejor calidad visual que recalcular píxel a píxel a mano.
Carlos