PDA

Ver la Versión Completa : Como rotar una imagen en delphi x grados SIN DEFORMARLA?


djmetroid
28-11-2007, 02:34:28
ya he visto los codigos 451 y 452 en trucomania que rotan una imagen x grados, pero hay un gran problema, que al ir rotando la imagen se va deformando y poniendose un fondo negro o blanco, por ejemplo, si quiero rotarla 45 grados se forma un octagono que afecta la imagen y el fondo es negro o blanco, ya puse transparencias, autosize, etc y aun sigue deformandose y necesito una aplicacion que rote imagenes 45 grados minimo, por favor si alguien sabe como solucionar ese problema se lo agradeceria
gracias

dec
28-11-2007, 02:40:02
Hola,

No sé si será matar moscas a cañonazos, pero, la librería Imaging para Delphi (http://imaginglib.sourceforge.net/) no sólo puede rotar imágenes (que lo hace, y muy bien) sino que puede hacer otras muchas cosas más, como convertir entre decenas de formatos de imagen. No es complicada de usar, por lo menos para lo que te propones, es de código abierto y gratuita, y, ya te digo, yo la he usado y aun uso con buenos resultados.

mbelda
03-12-2007, 19:06:03
Yo lo he intentado con imaging library pero no soporta TIFF, alquien sabe de alguna otra utilidad o librería que soporte TIFF, tengo que rotar imagenes TIFF, por ahora lo hago desde línea de comandos con un programa al que le paso parametros (rotar.exe .\imagen.tif rotate=90), pero no me acaba de convencer porque hasta que no se rote no puedo seguir con la ejecución del procedimiento, y la verdad es que es un apaño, estoy intentando encontrar algo para hacerlo desde codigo, pero en fin, estoy ciego de buscar por internet y no encontrar nada.

dec
03-12-2007, 19:16:40
Hola,

La librería susomentada soporta el formato TIFF. Yo juraría que este formato está soportado, a lo menos en parte. No recuerdo ahora mismo si puedes rotar una imagen TIFF, directamente, pero, lo que es casi seguro es que puedes convertir una imagen TIFF a BMP, por ejemplo, rotar dicha imagen BMP, y luego guardarla de nuevo en formato TIFF. Corrígeme si me equivoco.

mbelda
03-12-2007, 19:52:28
Pues no se si te equivocas porque no lo he probado, pero ahora que lo dices lo voy a ver posiblemente tengas razon, pero no veas la historia, convierte, rota y vuelve a convertir, pero si funciona, pues no es mala opcion. Gracias, por la idea, no me lo había propuesto por el tema de si pierde calidad, pero voy a ver que tal.

dec
03-12-2007, 19:56:00
Hola,

En realidad no es tanta "historia". Yo tengo un programa que usa la referida librería. El programa admite como entrada una imagen de cualquiera de los formatos de entradaq soportados, puede rotar la imagen, y, a continuación, guardarla en cualquiera de los formatos de salida soportados. Todo eso lo hace en "cero coma", como suele decirse. Vamos, que, no es tanta historia.

Y, eso suponiendo que no puedas rotar una imagen TIFF, directamente, y volverla a guardar. ¿Esto sí que lo probaste, no?

dec
03-12-2007, 20:07:46
Hola,

Acabo de comprobar que la librería soporta el formato TIFF y puede rotar imágenes en este formato directamente. Si descargas la librería verás que en la carpeta "demos" viene un programa de nombre "VampConvert.exe". Puedes usar el programa de esta forma:


VampConvert.exe -infile=C:\apple.tif -outfile=C:\appler.tif -rotate=90


El programa es una demostración de la librería en cuestión, quiere decirse, que lo que el programa hace puede hacerlo la librería.

Podrías utilizar un código similar a este, y, ojo que lo he adaptado "al vuelo" y sin probarlo del programa en que yo lo estoy usando, lo mismo se me escapa algo, pero, básicamente, esto es:


uses
Imaging, ImagingTypes, ImagingUtility;

{...}

function RotarImagen(imagenEntrada, imagenSalida, angulo: string): boolean;
var
img: TImageData;
aAngulo: integer;
begin
result := false;
InitImage(img);
try
aAngulo := StrToIntDef(angulo, 0);
if not Imaging.LoadImageFromFile(imagenEntrada,img) then
raise Exception.Create(ImagingUtility.GetExceptObject.Message);
if (aAngulo mod 90) = 0 then
result := Imaging.RotateImage(img,aAngulo)
else
raise Exception.Create(rsErrorImgAnguloIncorrecto);
if not Imaging.SaveImageToFile(imagenSalida,img) then
raise Exception.Create(ImagingUtility.GetExceptObject.Message);
finally
FreeImage(img);
end;
end;


Como verás, el formato de la imagen de entrada y el formato de la imagen de salida se deducen de su extensión. En el programa que menciono, tengo algún procedimiento que se encarga de comprobar que, efectivamente, tanto el formato de la imagen de entrada, como el de la imagen de salida, están soportados por la librería Imaging (http://imaginglib.sourceforge.net/).

mbelda
04-12-2007, 16:21:58
Lo de vanconvert.exe ya lo probe y no se porque me dijo "tipo de archivo no soportado", por eso lo había descartado, voy a probar lo que me propones, supongo que ira perfecto, muchas gracias, eres un máquina, si quieres venirte para el sur, no dudes en decirlo, estaria encantado de trabajar contigo, jeje. Estamos buscando programador en delphi + sqlserver.

mbelda
04-12-2007, 16:30:57
Me sigue sin funcionar el programa vampconvert, dice que tif no esta en los supported file formats <IMPUT>: jpg, bmp... pero tif no aparece.

Yo me descarge las librerias de sourceforge.net, la ultima versión, me puedes enviar por mail tu vampconvert.exe a ver si con el tuyo funciona y es cuestión de version? Gracias.

mbelda
04-12-2007, 16:34:46
Es la 0240 de 28-06-2007

mbelda
04-12-2007, 16:59:50
:)RotarImagen, funciona perfectamente, el código sin ningún error, corto, claro y efectivo, pero el tif no está dentro de los formatos reconocidos, he hecho la prueba con un jpg y funciona bien, pero el tif nada. He revisado las carpetas y dentro de Imaging está \Extras\Extensions\LibTiff, que supongo que hay es donde estarán las funciones para pasar de tif a jpg y de jpg a tif otra vez.

dec
04-12-2007, 17:53:50
Hola,

Pues te aseguro que yo probé ayer con una imagen "TIF". Otra cosa es que haya "imágenes TIF diferentes"... de hecho yo no encontré ninguna en mi disco duro, así que tuve que buscar un poco por ahí, pero, al cabo conseguí una imagen "TIF" (o que tenía extensión TIF, o que "ponía" que era TIF) y pude llevar a cabo la rotación sin problemas.

No sé... :(

salvica
03-01-2008, 16:18:55
Utiliza el componente TRotateImage (o algo así), es fácil de usar u gratuito
Saludos
salvica

ElDioni
03-01-2008, 17:51:07
Hace poco yo estaba con este mismo problema, aunque yo lo que tenía que transformar era un jpg, pero creo que te servirá igual, chequealo para ver si te funciona. Aquí te dejo el código, creo que lo saqué de la sección de trucos o de algún hilo, lo que tengo claro es que lo obtuve, como tantas veces, en clubdelphi, pagina a la que le estoy muy agradecido, sobre todo a sus foreros.


procedure TFrmGesArt.Convertir(Origen:string);//, Destino: string);
var
Imagen: TPicture;
Bitmap: TBitmap;
begin
Imagen:= TPicture.Create;
try
Imagen.LoadFromFile(Origen);
if not (Imagen.Graphic is TBitmap) then
begin
Bitmap:= TBitmap.Create;
try
Bitmap.Width:= Imagen.Width;
Bitmap.Height:= Imagen.Height;
Bitmap.Canvas.Draw(0,0,Imagen.Graphic);
image4.Picture.Bitmap:=bitmap;
//Bitmap.SaveToFile(Destino);
finally
Bitmap.Free;
end;
end else image4.picture.bitmap:=bitmap;//Imagen.SaveToFile(destino);
finally
Imagen.Free;
end;
end;


Espero que te sirva de algo

guilloking
27-05-2008, 07:07:21
Hola, ustedes sabrian como rotar un shape, no encuentro la manera.