Rotar imágenes el Delphi

Carlos Ariel Rojas Lugones
14 de Marzo del 2014
Hola. Necesito código fuente para rotar un TBitmap en Delphi. ¿Alguien pudiera ayudarme con eso? He probado varias opciones y nada me funciona. Gracias.

Carlos
12 de Agosto del 2026

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