Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   rotar imagen en c++ builder (https://www.clubdelphi.com/foros/showthread.php?t=56004)

pulpin 05-05-2008 03:53:54

rotar imagen en c++ builder
 
bueno amigos llego a ustedes con esta pequeña duda, como puedo rotar una imagen en un angulo x, me gustaria encontrar una forma facil y practica, pero recibo cualquier ayuda, ademas si conocen algun componente que me ayude en esto se los agradeceria, las ayudas que he encontrado en el foro solo han sido para el delphi, por esto les pido ayuda. de antemano gracias.:)

escafandra 05-05-2008 08:25:46

Revisa el truco 455 aunque está en delphi, puedes traducirlo a C o compilarlo tal cual. Recuerda que Builder compila código delphi.

Saludos.

pulpin 05-05-2008 09:10:21

te agradeceria mucho si me indicas como puedo hacer que el builder compile el codigo ya queme salen algunos (muchos) erroes, o si te queda tiempo y no es mucha molestia, traducirme las partes mas complicadas.gracias de nuevo:rolleyes:.

escafandra 05-05-2008 14:00:09

Guarda el código delphi en un archivo exclusivo para él. Nombralo como quieras por ejemplo MODULO.PAS

Incluyelo en el proyecto como harías con otro módulo escrito en C.

Incluye el archivo cabecera MODULO.HPP donde tengas que usar esas funciones escritas en delphi. Ese archivo cabecera lo va a crear Builder automáticamente cuando compiles es código delphi.

Saludos.

pulpin 05-05-2008 19:57:55

dime donde estoy errado:

copio el codigo en el notepad y lo guardo como .pas
luego abro el c++ builder, y abro el archivo .pas, pero no me permite compilar el archivo.

lo otro que intento es:

guardo el archivo como .pas en el notepad, luego adiciono el archivo .pas a mi proyecto, luego le doy copilar y me salen varios errores. los cuales tendre que estudiar para resolver.

gracias, espero tu opinion
:rolleyes:

escafandra 05-05-2008 20:16:16

Claro, Si simplemente has copiado el código, te faltan algunas cosas.
Debes definir una unidad completa con sus cabeceras...

Prueba a compilar este código tal cual, pero guardado en un archivo llamado Rotar.pas. Lo añades a tu proyecto....

Código Delphi [-]
unit Rotar;

//----------------------------------------------------------------------------------------
interface  

uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;  

function Rotate(Canvas: TCanvas; Width, Height, iAngle: Integer; Back: LongBool): TBitmap;



//----------------------------------------------------------------------------------------
implementation  

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;

end.
De esta forma seguro que compila
Saludos.



EDITO:

Tambien te compliará si en la linea uses colocas sólamente:
Código Delphi [-]
uses
  Windows, SysUtils, Classes, Graphics;

pulpin 05-05-2008 20:27:22

pues gracias se resolvieron algunos errores ahora solo me salen 4:

'UNIT' expected but 'INTERFACE' found
undeclared identifier TBitmap
undeclared identifier TCanvas
';' expected but 'IMPLEMENTATION' found
y un fatal error que dice que no puede compilar usando unit " C:\rotar.pas"

pulpin 05-05-2008 20:34:26

ahora solo me salen estos errores

el de UNIT
el de IMPLEMENTATION
y el ultimo

que me falta

escafandra 05-05-2008 20:44:08

Si has copiado todo el código tal y como te lo he posteado, en un archivo de texto llamado Rotar.pas, no deberías tener errores.

Lo he probado en C++Builder 5 y me compila perfectamente....

Repásalo bien.

Saludos.

pulpin 05-05-2008 21:03:22

muchas gracias, ya se, me habia equivocado en dos lineas, perdon por el error:D.

sumale una mas a mi deuda:p.

pulpin 05-05-2008 21:50:41

cuando le doy run a mi aplicacion me pide EnJpgGr.h, el archivo de cabecera que no tengo, crees que me falto algo.:confused:

escafandra 05-05-2008 23:36:32

Pues esa cabecera no tiene nada que ver con el código para rotar en cuestión. Tal vez estés usando otro código, ajeno al Builder, o de algún componente no standard.

He probado la rutina en una aplicación de prueba con un boton y un TImage.
El evento del botón hace esto:

Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Graphics::TBitmap *Bitmap;
  Bitmap = Rotate(Image1->Canvas, Image1->Width, Image1->Height, 90, 0);
  Image1->Picture->Assign(Bitmap);
  delete Bitmap;
}

Me funciona sin problemas.

Saludos.

pulpin 06-05-2008 06:23:59

gracias ya me funciono muy bien:)

Arroyo69 18-06-2008 08:58:54

He estado leiendo este tema y me han surgido diferentes problemas debido a q estoy programando en builder c++, no entiendo para que utiliza el back ese, y ademas cada vez que giro se me va haciendo la imagen mas pequeña.

escafandra 19-06-2008 12:51:35

Bueno, mírate esto, que es el corazón del tema. Trata de elejir tu rectangulo de forma correcta para que no te cambie el tamaño.

Saludos.

Arroyo69 19-06-2008 16:55:59

No lo entiendo. Serias tan amable de poder explicarmelo minimmente, es que estoy desesperado, ya que el delphi no lo entiendo muy bien ya que lo estoy aciendo en builder c++.
Gracias

escafandra 19-06-2008 22:18:12

Bueno, yo tampoco estoy fuerte en delphi, simplemente adapte el truco 455 para poderlo compilar y usar desde el Builder C++. El autor del código original es Javier Ferrari.

Como te decía el corazón es la API de windows GDI PlgBlt a la que puedes acceder desde C++ Builder directamente. La información de su uso la tienes en la ayude del Builder para API Win32 y en la web de Microsoft. Quizás esté mas clara la explicación de la ayuda de Builder, aunque el origen de la misma es Microsoft.

El resto del código no es mas que una preparación de los tres puntos vértice del paralelograma destino que está rotado y los datos del rectángulo de origen (x, y, ancho y alto).

Observa que al rotar la imagen sobre el rectángulo original, quedan zonas vacías que se rellenan con una máscara si la defines. La API PlgBlt también permite escalar la imagen, con lo que puedes cambiarla de tamaño.

Experimenta con ella. Espero haberte servido de alguna ayuda.

Saludos.

cHackAll 20-06-2008 20:26:41

Hola, como comentaba en el truco en cuestión, he convertido mi code a BCB para que lo puedan manejar a su gusto... espero que el uso de @ funcione tal y como en C++

Saludos

Arroyo69 21-08-2008 17:55:56

Problema
 
Gracias a todos por la ayuda, pero sigo teniendo un poblema.
Todo me funciona bien, pero al moverse mi imagen es de 50X140 y se me sale de mi timage, con lo cual se me corta la imagen y la primera vez me lo hace bien pero las siuientes veces que voy girando m va desapareciendo hasta que desaparece del timage.

Arroyo69 09-09-2008 01:11:34

ayuda
 
solicito ayuda a mi pregunta anterior, por favar.
Gracias


La franja horaria es GMT +2. Ahora son las 22:44:01.

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