Creo que es todo lo necesario para corregir imágenes escaneadas y tambien para edición de imagenes.
Código Delphi
[-]function Rotate(Canvas: TCanvas; Width, Height, iAngle: Integer; Back: LongBool): TBitmap;
var
Points: array [0..2] of TPoint;
Radio, Angle, _Angle: Real;
begin
Points[0] := Point(-Width, Height);
Points[1] := Point(Width, Height);
Points[2] := Point(-Width, -Height);
Radio := Sqrt(Sqr(Width / 2) + Sqr(Height / 2));
_Angle := (360 - (iAngle mod 360)) * pi / 180;
iAngle := 3;
repeat Dec(iAngle);
Angle := ArcTan(Points[iAngle].Y / Points[iAngle].X) + _Angle;
if Points[iAngle].X < 0 then
Angle := Angle + Pi;
Points[iAngle] := Point(Round((Cos(Angle) * Radio) + Radio), Round(Radio - (Sin(Angle) * Radio)));
until not LongBool(iAngle);
Result := TBitmap.Create;
Result.TransparentColor := clFuchsia;
Result.Canvas.Brush.Color := clFuchsia;
iAngle := Round(Radio * 2);
Result.Height := iAngle;
Result.Width := iAngle;
plgblt(Result.Canvas.Handle, Points, Canvas.Handle, 0, 0, Width, Height, 0, 0, 0);
if Back then Result.Canvas.CopyRect(Rect(0, 0, iAngle, iAngle), Result.Canvas, Rect(iAngle-1, 0, 0, iAngle));
end;
Modo de uso:
Código Delphi
[-]procedure TForm1.TrackBar1Change(Sender: TObject);
var Bitmap: TBitmap;
begin
ImageHolder.Picture.LoadFromFile('c:\windows\Grano de café.bmp'); Bitmap := Rotate(ImageHolder.Canvas, ImageHolder.Width, ImageHolder.Height, TrackBar1.Position, CheckBox1.Checked);
ImageHolder.Picture.Assign(Bitmap);
Bitmap.Destroy;
end;
Alternativas óptimas:
180º
Result.Canvas.CopyRect(Rect(0, 0, Width, Height), Canvas, Rect(Width, Height - 1, 0, 0));
0º
BitBlt(Result.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY);
PD: en un truco anterior (
Crear Thumbnails en blanco y negro de archivos JPEG), no hice la siguiente aclaración; se debiese liberar en algún momento la memoria asignada por la función... retorna un TBitmap asignado por si el usuario requiera editar el grafico después de utilizar la función.