Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Unir imagenes jpg (https://www.clubdelphi.com/foros/showthread.php?t=32047)

alain 25-05-2006 08:03:24

Unir imagenes jpg
 
Hola, hace rato que estoy buscando una forma de hacer esto y realmente no encuentro manera de hacerlo.
Lo que necesito es formar una sola imagen (una tira) a partir de varias imagenes jpg (pueden ser muchas, y grandes, hasta 15 megas), osea, unir varias imagenes colocando una bajo la otra, y luego obviamente, guardarla en un archivo jpg separado.

Disculpen mi ignoracia pero soy nuevo trabajando con imagenes en delphi.
Desde ya, muchas gracias.


Salu2!

seoane 25-05-2006 13:21:12

Una posible solucion puede ser esta, una funcion que concatena todas las imagenes jpg de un directorio en un tira:

Código Delphi [-]
uses JPEG;

function Max(i,j: Integer): Integer;
begin
  if i > j then
    Result:= i
  else
    Result:= j;
end;

procedure Concatenar(Destino, Origen: TGraphic);
var
  Bitmap: TBitmap;
begin
  Bitmap:= TBitmap.Create;
  try
    Bitmap.Width:= Max(Origen.Width, Destino.Width);
    Bitmap.Height:= Origen.Height + Destino.Height;
    Bitmap.Canvas.Draw(0,0,Origen);
    Bitmap.Canvas.Draw(0,Origen.Height,Destino);
    Destino.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;


// Directorio es el directorio con las imagenes
// y Resultado el archivo jpg donde se guarda la tira
procedure HacerTira(Directorio: string; Resultado: string);
var
  SR: TSearchRec;
  Tira: TBitmap;
  Temp: TJPEGImage;
begin
  Tira:= TBItmap.Create;
  Temp:= TJPEGImage.Create;
  try
    if Copy(Directorio, Length(Directorio), 1) = '\' then
      Delete(Directorio, Length(Directorio), 1);
    if FindFirst(Directorio + '\*.jp*', faAnyfile, SR) = 0 then
    repeat
      Temp.LoadFromFile(Directorio + '\' + SR.Name);
      Concatenar(Tira,Temp);
    until FindNext(SR) <> 0;
    FindClose(SR);
    Temp.Assign(Tira);
    Temp.SaveToFile(Resultado);
  finally
    Tira.Free;
    Temp.Free;
  end;
end;

Aunque hice algunas pruebas y se queda sin memoria bastante rapido si las imagenes son muchas y grandes :D . Pero puede que te sirva para tener algunas ideas.

alain 25-05-2006 19:06:44

seoane, muchas gracias por responder. Probe tu solucion y me funciona perfecto, pero con imagenes de no mas de 1 mega. Si son mas grandes me salta un "EOutOfResources: espacio de almacenamiento insuficiente para procesar este comando". El error me lo tira en la 3° o 4° vez que intenta hacer el

Código Delphi [-]
Bitmap.Height:= Origen.Height + Destino.Height;


Estoy buscando la forma de hacer algo parecido a lo que me pasaste pero sin cargarlo en memoria ya que son extremadamente grandes (de 10 megas para arriba..) las imagenes con las q estoy trabajando.
Todavia no encontre una manera de hacerlo, asi que si se te ocurre como hacerlo, o a alguien de por aca, realmente se lo voy a agradecer.
Gracias nuevamente.

Salu2!

seoane 25-05-2006 19:20:38

La limitacion viene impuesta por el propio delphi que no puede manejar imagenes tan grandes, tendras que utilizar algun componente de terceros para tratar las imagenes.

Si me permites la pregunta, ¿para que quieres unas imagenes de ese tamaño? a lo mejor si nos cuentas para que lo necesitas te podemos dar una solucion alternativa.

alain 25-05-2006 20:18:27

Es q estoy desarrollando un sistema para un negocio, y uno de los requisitos es eso, a partir de n imagenes formar una sola, luego con la imagen resultante ellos hacen no se q cosa. Son fotografias q sacan con camaras profesionales, y a maxima resolucion, por eso son tan grandes.
Ahora mismo estoy por probar con "ImageMagick" y un componente para delphi (PascalMagick), q supuestamente permiten trabajar con imagenes muy grandes.
Bueno, gracias por tu ayuda seoane, si logro hacerlo funcionar despues lo comento por aca.

Saludos!!

alain 28-06-2006 16:47:41

solucion
 
Hola gente, simplemente queria comentar como resolvi esto de las limitaciones con los tamaños de las imagenes. Me pase de jpg a png, osea cargo imagenes jpg, las paso a un bitmap, y de ahi las acoplo a la imagen "grande" png. No tuve ni un tipo de limitaciones usando png, ya genere imagenes de cerca de 60.000 x 4.000 pixels mas o menos, asi q de lujo ;)
Uso el componente pngimage http://pngdelphi.sourceforge.net/
Y nada mas, despues para pasar a jpg probe llamando desde delphi a un programa para consola q se llama png2jpg, y me las convirtio sin problemas a las imagenes grandotas.
Bueno, espero q les sea util
Salu2!

mrnovice 09-04-2008 22:10:29

EOutOfResources
 
Cita:

Empezado por alain (Mensaje 144166)
Hola gente, simplemente queria comentar como resolvi esto de las limitaciones con los tamaños de las imagenes. Me pase de jpg a png, osea cargo imagenes jpg, las paso a un bitmap, y de ahi las acoplo a la imagen "grande" png. No tuve ni un tipo de limitaciones usando png, ya genere imagenes de cerca de 60.000 x 4.000 pixels mas o menos, asi q de lujo ;)
Uso el componente pngimage http://pngdelphi.sourceforge.net/
Y nada mas, despues para pasar a jpg probe llamando desde delphi a un programa para consola q se llama png2jpg, y me las convirtio sin problemas a las imagenes grandotas.
Bueno, espero q les sea util
Salu2!

saludos hola yo tengo el problema de EOutOfResources quiero acoplarlo a un JvThumbview el problema conmigo es que tengo muchas imagenes grandes de 2480 x 3507 pix y me tira ese error con ese componente pero con las chiquitas si funciona,usaste un componente tercero verdad y lo transformaste a png verdad, pero la duda es que si al final los dejabas como jpeg y ya no te tira el error? saludos y gracias


La franja horaria es GMT +2. Ahora son las 18:38:26.

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