Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Rotando una imagen (https://www.clubdelphi.com/foros/showthread.php?t=80850)

cHackAll 17-12-2007 21:47:56

Rotando una imagen
 
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);
// Points[3] := 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'); // TrackBar1.Min := -160; TrackBar1.Max := 160;
 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));
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.

cHackAll 20-06-2008 20:20:34

Vista la necesidad he convertido el anterior code a BCB, disfrútenlo;

Código:

#include <math.h>
#include <math.hpp>

// ...

Graphics::TBitmap *Rotate(TCanvas *Source, int Width, int Height, int Angle, bool Reverse)
{
 Double Radio = sqrt(pow(Width / 2, 2) + pow(Height / 2, 2)), AngleRad = (360 - (Angle % 360)) * M_PI / 180;
 TPoint Points[3] = {Point(Width, -Height), Point(Width, Height), Point(Width, Height)};
 for (int Index = 0; Index < 3; Index++)
 {
  Double Angle = ArcTan2(Points[Index].y, Points[Index].x) + AngleRad + ((Index % 2)? 0 : M_PI);
  Points[Index] = Point(RoundTo((cos(Angle) * Radio) + Radio, 0), RoundTo(Radio - (sin(Angle) * Radio), 0));
 }

 Graphics::TBitmap *Result = new Graphics::TBitmap();
 Result->Canvas->Brush->Color = clFuchsia;
 Result->TransparentColor = clFuchsia;
 int Size = RoundTo(Radio * 2, 0);
 Result->Height = Size;
 Result->Width = Size;

 PlgBlt(Result->Canvas->Handle, Points, Source->Handle, 0, 0, Width, Height, 0, 0, 0);
 if (Reverse) Result->Canvas->CopyRect(Rect(0, 0, Size, Size), Result->Canvas, Rect(Size - 1, 0, 0, Size));
 return Result;
}

Modo de uso:

Código:

void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
 ImageHolder->Picture->Assign(Image1->Picture);
 Graphics::TBitmap *Bitmap = Rotate(ImageHolder->Canvas, ImageHolder->Width, ImageHolder->Height, TrackBar1->Position, CheckBox1->Checked);
 ImageHolder->Picture->Assign(Bitmap);
 Bitmap->Free();
}



La franja horaria es GMT +2. Ahora son las 23:17:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi