Ir al contenido


Como rotar un BitMap


  • Por favor identifícate para responder
7 respuestas en este tema

#1 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 18 diciembre 2008 - 09:15

Hola amigos, hace algunos dias le pregunte a algunos amigos como rotar un bitmap y pues no encontre respuestas.Buscando en Google encontre un codigo que me dio la idea de como lograrlo.


delphi
  1. procedure TForm1.BitBtn1Click(Sender: TObject);
  2. procedure RotateBitmap(OrigBmp: TBitmap; Angle: real; DestBmp: TBitmap);
  3.   var
  4.     ang,
  5.     sinang, cosang,
  6.     xori, yori,
  7.     xrot, yrot,
  8.     dx, dy          : extended;
  9.     i, j            : integer;
  10.     tmpbmp          : TBitmap;
  11.  
  12. begin
  13. tmpbmp := TBitmap.Create;
  14.  
  15.     try
  16.   tmpbmp.Width := OrigBmp.Width;
  17.       tmpbmp.Height := OrigBmp.Height;
  18.       tmpbmp.PixelFormat := OrigBmp.PixelFormat;
  19.     ang := DegToRad(Angle);
  20.   dx := (OrigBmp.Width-1) / 2;
  21.       dy := (OrigBmp.Height-1) / 2;
  22.   SinCos(ang, sinang, cosang);
  23.   for i := 0 to tmpbmp.Height -1 do
  24.       begin
  25.     for j := 0 to tmpbmp.Width - 1 do
  26.         begin
  27.   xori := j - dx;
  28.           yori := i - dy;
  29.   xrot := (xori * cosang) - (yori * sinang);
  30.           yrot := (xori * sinang) + (yori * cosang);
  31.   xrot := xrot + dx;
  32.           yrot := yrot + dy;
  33.   tmpbmp.Canvas.Pixels[j, i] :=
  34.             OrigBmp.Canvas.Pixels[Round(xrot), Round(yrot)];
  35.         end;
  36.       end;
  37.   DestBmp.Assign(tmpbmp);
  38.     finally
  39.     tmpbmp.Free;
  40.     end;
  41.   end;
  42. begin
  43.   RotateBitmap(Image1.Picture.Bitmap,-15,Image1.Picture.Bitmap);
  44. end;


Pues aqui esta y espero que les pueda ser de alguna ayuda.
En mi caso lo que queria era lograr que un avion pudiera hacer alguna inclinacion a ambos lados y algunos grados.Tambien se puede usar para graficos representativos en alguna funcion industrial.

Un Saludo.

#2 Caral

Caral

    Advanced Member

  • Administrador
  • 4.261 mensajes
  • LocationCosta Rica

Escrito 18 diciembre 2008 - 12:31

Hola
Muy interesante Jose.
Tengo algo parecido que me dio cHackAll, pero por alguna razon no camina solo pero si dentro del programa que lo tengo, seguro le falta algo. :o
Tal vez si pasa por aqui nos lo explica:
A la izquierda:


delphi
  1. procedure TForm1.Button3Click(Sender: TObject);
  2. procedure RotarAntiH(BMPOrigen, BMPDestino:TBitmap);
  3. var
  4.   f,c:integer;
  5.   Ancho,Alto:integer;
  6.   tmpBMP: TBitmap;
  7. begin
  8.   {Bitmap temporal}
  9.   tmpBMP:=TBitmap.create;
  10.   with tmpBMP do
  11.   begin
  12.     Width:=BMPOrigen.height;
  13.     Height :=BMPOrigen.width;
  14.   end;
  15.  
  16.   {Inicializamos los límites de los bucles}
  17.   {Initialize loop's limits}
  18.   Ancho:=BMPOrigen.Width-1;
  19.   Alto :=BMPOrigen.Height-1;
  20.  
  21.   {Copiamos los pixels}
  22.   {Copy the pìxels}
  23.   for f:=0 to Alto do
  24.   begin
  25.     for c:=0 to Ancho do
  26.     begin
  27.       tmpBMP.Canvas.Pixels[f,Ancho-c]:=BMPOrigen.Canvas.Pixels[c,f];
  28.       Application.processmessages;
  29.     end;
  30.  
  31.   end;
  32.  
  33.   BMPDestino.Assign(tmpBMP);
  34.   tmpBMP.Free;
  35. end;
  36.  
  37. begin
  38.   RotarAntiH(ImageHolder.Picture.Bitmap,ImageHolder.Picture.Bitmap);
  39. end;
  40. [/delphi]
  41. A la Derecha:
  42. [delphi=delphi]
  43. procedure TForm1.Button4Click(Sender: TObject);
  44. procedure RotarH(BMPOrigen, BMPDestino:TBitmap);
  45. var
  46.   f,c:integer;
  47.   Ancho,Alto:integer;
  48.   tmpBMP: TBitmap;
  49. begin
  50.   {Bitmap temporal}
  51.   tmpBMP:=TBitmap.create;
  52.   with tmpBMP do
  53.   begin
  54.     Width:=BMPOrigen.height;
  55.     Height :=BMPOrigen.width;
  56.   end;
  57.  
  58.   {Inicializamos los límites de los bucles}
  59.   {Initialize loop's limits}
  60.   Ancho:=BMPOrigen.Width-1;
  61.   Alto :=BMPOrigen.Height-1;
  62.  
  63.   {Copiamos los pixels}
  64.   {Copy the pìxels}
  65.   for f:=0 to Alto do
  66.   begin
  67.     for c:=0 to Ancho do
  68.     begin
  69.       tmpBMP.Canvas.Pixels[Alto-f,c]:=BMPOrigen.Canvas.Pixels[c,f];
  70.       Application.processmessages;
  71.     end;
  72.  
  73.   end;
  74.  
  75.   BMPDestino.Assign(tmpBMP);
  76.   tmpBMP.Free;
  77. end;
  78.  
  79. begin
  80.   RotarH(ImageHolder.Picture.Bitmap,ImageHolder.Picture.Bitmap);
  81. end;


Saludos
  • 0

#3 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 18 diciembre 2008 - 01:01

Hola Carlos,  añade "Math" en el uses de tu form a ver que pasa. ;)


Un Saludo.


#4 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 18 diciembre 2008 - 01:14

Bueno a mi me funciono:


delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ExtCtrls, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     Image1: TImage;
  13.     procedure Button1Click(Sender: TObject);
  14.   private
  15.     { Private declarations }
  16.   public
  17.     { Public declarations }
  18.   end;
  19.  
  20. var
  21.   Form1: TForm1;
  22.  
  23. implementation
  24.  
  25. {$R *.dfm}
  26.  
  27. procedure TForm1.Button1Click(Sender: TObject);
  28. procedure RotarH(BMPOrigen, BMPDestino:TBitmap);
  29. var
  30. f,c:integer;
  31. Ancho,Alto:integer;
  32. tmpBMP: TBitmap;
  33. begin
  34. tmpBMP:=TBitmap.create;
  35. with tmpBMP do
  36. begin
  37. Width:=BMPOrigen.height;
  38. Height :=BMPOrigen.width;
  39. end;
  40. Ancho:=BMPOrigen.Width-1;
  41. Alto :=BMPOrigen.Height-1;
  42. for f:=0 to Alto do
  43. begin
  44. for c:=0 to Ancho do
  45. begin
  46.   tmpBMP.Canvas.Pixels[Alto-f,c]:=BMPOrigen.Canvas.Pixels[c,f];
  47.   Application.processmessages;
  48.   end;
  49.   end;
  50.   BMPDestino.Assign(tmpBMP);
  51.   tmpBMP.Free;
  52.   end;
  53. begin
  54. RotarH(Image1.Picture.Bitmap,Image1.Picture.Bitmap);
  55. end;
  56.  
  57. end.


Un Saludo.

#5 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 598 mensajes

Escrito 19 diciembre 2008 - 11:23

Dado un codigo ya publicado...


delphi
  1. function Rotate(Canvas: TCanvas; Width, Height, iAngle: Integer; Back: LongBool = False): TBitmap;
  2. var
  3. Points: array [0..2] of TPoint;
  4. Radio, Angle, _Angle: Real;
  5. begin
  6. Points[0] := Point(-Width, Height);
  7. Points[1] := Point(Width, Height);
  8. Points[2] := Point(-Width, -Height);
  9. // Points[3] := Point(Width, -Height);
  10. Radio := Sqrt(Sqr(Width / 2) + Sqr(Height / 2));
  11. _Angle := (360 - (iAngle mod 360)) * pi / 180;
  12. iAngle := 3;
  13. repeat Dec(iAngle);
  14.   Angle := ArcTan(Points[iAngle].Y / Points[iAngle].X) + _Angle;
  15.   if Points[iAngle].X < 0 then
  16.    Angle := Angle + Pi;
  17.   Points[iAngle] := Point(Round((Cos(Angle) * Radio) + Radio), Round(Radio - (Sin(Angle) * Radio)));
  18. until not LongBool(iAngle);
  19.  
  20. Result := TBitmap.Create;
  21. Result.TransparentColor := clFuchsia;
  22. Result.Canvas.Brush.Color := clFuchsia;
  23. iAngle := Round(Radio * 2);
  24. Result.Height := iAngle;
  25. Result.Width := iAngle;
  26. plgblt(Result.Canvas.Handle, Points, Canvas.Handle, 0, 0, Width, Height, 0, 0, 0);
  27. if Back then Result.Canvas.CopyRect(Rect(0, 0, iAngle, iAngle), Result.Canvas, Rect(iAngle-1, 0, 0, iAngle));
  28. end;


he realizado una incrustacion del mismo en éste juego... solo bastara con analizarlo un poco y podran rotar cualquier cosa... (&)


delphi
  1. Image1.Picture.Assign(Image2.Picture.Bitmap.Canvas, Image2.Picture.Width, Image2.Picture.Height, 66); // MemoryLeak


Saludos
  • 0

#6 thelibmx

thelibmx

    Newbie

  • Miembros
  • Pip
  • 6 mensajes
  • LocationMéxico

Escrito 07 diciembre 2010 - 02:23

Hola una disculpa si violo las normas del foro, me aparecio un mensaje que indica que ya tiene dias este tema y que tal ves lo mejor era empezar un nuevo tema... pero creo que esta un poco relacionado mi duda

Yo necesito rotar una imagen 90° a la izquierda o derecha, esta imagen esta en un timage, pero es JPG, solo he encontrado codigo para rotar con bitmap, mi pregunta es, si es necesario que tenga que convertir mi imagen jpg a bmp, o  puedo rotar la imagen jpg directamente desde el timage? agradeceria su ayuda :huh:
  • 0

#7 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 598 mensajes

Escrito 08 diciembre 2010 - 08:58

Hola,
Debes convertir el JPG a BMP, rotar y solo si deseas guardarlo como jpg lo vuelves a convertir a JPG.



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var Bitmap: TBitmap;
  3. begin
  4. Bitmap := TBitmap.Create;
  5. Bitmap.Assign(Image1.Picture.Graphic);
  6. Image1.Picture.Assign(Rotate(Bitmap.Canvas, Bitmap.Width, Bitmap.Height, 90));
  7. Bitmap.Destroy;
  8. end;


  • 0

#8 thelibmx

thelibmx

    Newbie

  • Miembros
  • Pip
  • 6 mensajes
  • LocationMéxico

Escrito 09 diciembre 2010 - 03:40

Gracias  cHackAll me ha servido de mucho la respuesta, y me surge otra mas, no he trabajado mucho con lo que es imagenes y canvas,yo las imagenes que utilizo son jpg con tamaño 2352x1624p(1 a 3 mb), con el codigo que hay aqui (la funcion rotate) he logrado rotar las imagenes pero despues de rotarla 3 veces me sale un mensaje de: EOutofResources with message' Espacio de almacenamiento insuficiente para procesar este comando'... voy utilizar de 2,000 a 10,000 imagenes o mas en ese proceso pues se tienen que revisar que cumplan con ciertas caracteristicas, (se que se lée que son demaciadas imagenes pero no son tantas en realidad y el proceso tampoco es de mucha complejidad...),no creo que tenga que ver con el espacio en el disco duro pues cuento con mas del 60% libre, creo que tiene que ver con liberar la memoria o la imagen pero  no he comprendido bien a que se refieren con liberar la imagen, o no se si ese mensaje tenga que ver con eso, agradeceria las pistas,asesoria o consejos que me pudieran dar con respecto a ese mensaje, Gracias de nuevo  :s

Les pongo las partes de codigo que ocupe que practicamente es lo mismo que ya esta aqui, pero solo para que vean como lo tengo, igual se me fue algo

delphi
  1. function Rotate(Canvas: TCanvas; Width, Height, iAngle: Integer; Back: LongBool = False): TBitmap;
  2. var
  3. Points: array [0..2] of TPoint;
  4. Radio, Angle, _Angle: Real;
  5. begin
  6. Points[0] := Point(-Width, Height);
  7. Points[1] := Point(Width, Height);
  8. Points[2] := Point(-Width, -Height);
  9. // Points[3] := Point(Width, -Height);
  10. Radio := Sqrt(Sqr(Width / 2) + Sqr(Height / 2));
  11. _Angle := (360 - (iAngle mod 360)) * pi / 180;
  12. iAngle := 3;
  13. repeat Dec(iAngle);
  14.   Angle := ArcTan(Points[iAngle].Y / Points[iAngle].X) + _Angle;
  15.   if Points[iAngle].X < 0 then
  16.   Angle := Angle + Pi;
  17.   Points[iAngle] := Point(Round((Cos(Angle) * Radio) + Radio), Round(Radio - (Sin(Angle) * Radio)));
  18. until not LongBool(iAngle);
  19.  
  20. Result := TBitmap.Create;
  21. Result.TransparentColor := clFuchsia;
  22. Result.Canvas.Brush.Color := clFuchsia;
  23. iAngle := Round(Radio * 2);
  24. Result.Height := iAngle;
  25. Result.Width := iAngle;
  26. plgblt(Result.Canvas.Handle, Points, Canvas.Handle, 0, 0, Width, Height, 0, 0, 0);
  27. if Back then Result.Canvas.CopyRect(Rect(0, 0, iAngle, iAngle), Result.Canvas, Rect(iAngle-1, 0, 0, iAngle));
  28. end;
  29. /////////
  30. procedure TForm1.Button1Click(Sender: TObject);
  31. var Bitmap: TBitmap;
  32. begin
  33.  
  34. Bitmap := TBitmap.Create;
  35. Bitmap.Assign(Image1.Picture.Graphic);
  36. Image1.Picture.Assign(Rotate(Bitmap.Canvas, Bitmap.Width, Bitmap.Height, 90));
  37. //Bitmap.Destroy;
  38. Bitmap.free;
  39. end;
  40.  
  41.  
  42.  
  43. /////



La imagen la tengo en un timage dentro de un scrollbox1, mas o menos lo que quiero hacer es una especie de visor de imagenes de windows, que tiene para alejar,acercar, rotar a la izq, o derecha una imagen
  • 0