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 dos o más imágenes (https://www.clubdelphi.com/foros/showthread.php?t=63762)

BlackDaemon 02-03-2009 04:24:17

Unir dos o más imágenes
 
Hola

Bueno, no sabía que título poner a este tema, pues buscando en el foro he encontrado que ya se había tratado esto de unir 2 o más imágenes en forma lineal y hacer una sola, en este hilo tocan el tema:
http://www.clubdelphi.com/foros/show...=unir+imagenes

Y bueno, el problema es que consume mucha memória y delphi creo qu eno puede manejar imágenes muy grandes.

Ahora mi problema o más bien lo que quiero hacer es poder unir 4 imágenes o más, pero en forma de tablero, osea si tengo las imágenes 0,0 - 0,1 - 1,0 - 1,1, lo que quisiera hacer es un cuadrado de 2x2 con las 4 imágenes, y lo mismo si tengo más imáganes, no siempre tendrá que ser un cuadrado, puede ser un rectángulo, osea una sola imágen de 2x3 por ejemplo, no se como manipular imáganes en delphi, pero bueno, tendré que aprender, al parecer es crear un Timage del tamaño del total de todo el ancho x largo de la suma de las imágenes de ahí ya no sé qué propiedads tendrá el canvas para esto.. y bueno, a ver si alguien me puede ayudar con esto, por cierto, las imágenes son .jpg y quisiera guardar el resultado en el mismo formato, ahora bien, como estoy tratando con múuuchas imágenes me imagino que el resultado final será bastante grande.

Saludos!

Neftali [Germán.Estévez] 02-03-2009 08:45:20

En mi página web hay un ejemplo justo de lo contrario, trocear una imagen en N dividiendo la inicial en forma de tablero. Ya se que no es exactamente lo mismo, pero creo que si revisas el código te pueda dar la idea de cómo hacerlo.

Creo que la idea es muy similar, y las herramientas paa conseguirlo, las mismas. En una, se divide el canvas y se guardan las partes, en el otro (el tuyo), se trata de crear un canvas más grande e ir añadiendo los trozos.

Un saludo.

BlackDaemon 02-03-2009 14:43:14

Hola

Pues he bajado el ejemplo y poco o nada le entiendo jeje, primero tengo una duda, ¿por que siempre trabajan con mapa de bits (.bmp)? y no con un jpg o png ?

Bueno, lo que no se muy bien como hacer es a la hora de crear mi Timage, de que tamaño lo crearía ? de la suma de todos los lados por anchos de las imágenes a unir ?? O iría agrandando de acuerdo a lo que necesite ?
ya que como comenté antes, la imágen resultante puede ser _muy_ grande.. por cierto, hasta cuanto de tamaño puedo crear una imágen en delphi ? ya que había pensando que si se necesita más grande, pues que se creen 2 o 4, dependiendo del máximo soportado por delphi

Saludos!

Neftali [Germán.Estévez] 02-03-2009 15:52:01

Cita:

Empezado por BlackDaemon (Mensaje 339823)
¿por que siempre trabajan con mapa de bits (.bmp)? y no con un jpg o png ?

Porque es un ejemplo.
Entre otras cosas, porque el ejemplo es antiguo y Delphi sólo soporta PNG desde la última versión. En cuanto a JPEG supongo que se podrá hacer sin problemas.

Cita:

Empezado por BlackDaemon (Mensaje 339823)
Bueno, lo que no se muy bien como hacer es a la hora de crear mi Timage, de que tamaño lo crearía ? de la suma de todos los lados por anchos de las imágenes a unir ??

Pues eso sería bastante lógico. Crear un TCanvas con la dimensión total (si es que la conoces) y pegar en cada punto la imagen que toca.

Cita:

Empezado por BlackDaemon (Mensaje 339823)
O iría agrandando de acuerdo a lo que necesite ?
ya que como comenté antes, la imágen resultante puede ser _muy_ grande.. por cierto, hasta cuanto de tamaño puedo crear una imágen en delphi ? ya que había pensando que si se necesita más grande, pues que se creen 2 o 4, dependiendo del máximo soportado por delphi

El ir agrandando no creo que te solucione el problema; Si tienes problemas con una imagen grande, aunque empieces con ella pequeña, cuando la vayas agrandando llegarás a tener el mismo problema.

No se a qué te refieres con muy grande. Supongo que los límites vienen dados por la memoria; De todas formas cualquier tratamiento con imágenes grandes va a ser lento y tedioso. Das pocas explicaciones de qué vas a hacer luego con esa imagen tan grande, pero yo optaría por no trabajar con imágenes gigantescas, sino con imágenes más pequeñas que luego combinas para simuñar una más grande.

BlackDaemon 02-03-2009 16:10:03

Hola

Bueno, me a quedado todo claro, y tienes razón en eso de ir haciendo más grande las dimenciones del Timage, mejor lo hago a la primera, y si, si conozco el tamaño que tendrá al final.

Ahora lo que intento hacer es esto:
1.- .Crear una clase derivada de Timage (la cual contendrá todo el tablero)
2.- Asignarle el tamaño de si ancho y alto (suma de todas las dimenciones de imágenes pequeñas)
3.- Crear otra clase derivada de Timage (la cual contendrá la imágen pequeña)
4.- Cargo la primera imágen pequeña
5.- Ahora la copiaría a la esquina superior izquiera de Timage grande (Cómo hago esto??)
6.- Lo mismo que 5, pero abajo de la primera
7.- ahora a la derecha y por último abajo de la imágen de la derecha

Bueno, esto suponiendo que tengo 4 imágenes y que para unirlas tendría que seguir esto:

0,0 - 1,0
0,1 - 1,1

So tendría de 3x3 pues así:

0,0 - 1,0 - 2, 0
0,1 - 1,1 - 2, 1
0,2 - 1,2 - 3, 2

Bueno, creo que la lógica la sé, pero lo que no sé es que funciones, propiedades usar para copiar, pegar de un Timage a otro :D

Luego supongo que con 2 bucles anidados solucionaría el problema

A ver si alguien me puede guiar con un poco de código, desde ya muchas gracias

Saludos!

Neftali [Germán.Estévez] 02-03-2009 16:15:43

Cita:

Empezado por BlackDaemon (Mensaje 339833)
Bueno, creo que la lógica la sé, pero lo que no sé es que funciones, propiedades usar para copiar, pegar de un Timage a otro

De ahí venía la recomendación del ejemplo.
Debes Copiar un TCanvas (n directamente el TImage) sobre otro (cosa que hay en el ejemplo).
TRabajas con TImage, pero para copiar/pegar porciones, lo haces con la propiedad Canvas del TImage.

Neftali [Germán.Estévez] 02-03-2009 16:26:20

1 Archivos Adjunto(s)
Tal vez con un ejemplillo quede más claro.

BlackDaemon 02-03-2009 16:57:10

Hola

Bueno, lo que hice hasta el momento es esto:

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var
  x, y, z, i, j : Integer;
  anchoImg, altoImg : Integer;
  ImagenXY : TImage;
  str, lado : String;
begin
  anchoImg := 256;
  altoImg := 256;
  x := 0;
  y := anchoImg;
  z := 3;
  lado := 'DERECHA';

  Memo1.Lines.Add('Creamos el Timage de: ' + IntToStr(anchoImg * z) + 'px * ' + IntToStr(altoImg * z) + 'px');
    for i := 0 to z  - 1 do
    begin
      for j := 0 to z - 1 do
      begin
        str := 'Copiamos la imagen  ' + IntToStr(i) + ',' +IntToStr(j) + ' desde: ' + IntToStr(x) + ' hasta: ' + IntToStr(y) + ' Pos: ' + lado;
        Memo1.Lines.Add(str);
        x := y;
        y := y + anchoImg;
        lado := 'ABAJO';
      end;
      x := 0;
      y := anchoImg;
      Memo1.Lines.Add(' ================ ');
      lado := 'DERECHA';
    end;


end;

Al parecer estoy aplicando las funciones de copiar de Canvas debería estar solucionado, pero ¿Cuales son esas propiedades/funciones ?


EDIT:

Bueno, mientras escribía ya el señor Neftali había puesto 2 post, joer xD
ya me bajé el ejemplo y estoy probando y al parecer solo tengo que incorportarlo en lo que hice, claro, si eso estará bien, cosa que no lo creo jeje

Saludos!

Neftali [Germán.Estévez] 02-03-2009 17:10:31

Código:

Razón: Mi conexión es más lenta que la de Neftali xD
Tu conexión está bien.
Tus dedos son más lentos que los de Neftalí....;)

BlackDaemon 02-03-2009 19:22:58

Hola

Le cuento que su ejemplo me a resultado muy útil, creo que ya lo tengo hecho, aunque no sé, siempre pienso que lo hago de mal forma y por eso pegaré aquí el código a ver que opinan los maestros y así aprender de ustedes, esto es para unir imágenes como lo había explicado en los anteriores post, a ver si a más de uno le sirve:

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var
  x, y, i, j : Integer;

  anchoImg, altoImg : Integer;

  izq, arr, der, aba : Integer;

  ARect : TRect;

  imagen : TImage;
  str, nameImg, path : String;
begin
  anchoImg := 50;
  altoImg := 50;

  izq := 0;
  arr := 0;
  der := anchoImg;
  aba := altoImg;

  x := 2;
  y := 2;


  Memo1.Lines.Add('Creamos el Timage de: ' + IntToStr(anchoImg * x) + 'px * ' + IntToStr(altoImg * y) + 'px');
  map.Height := (anchoImg * x);
  map.Width := (altoImg * y);
    for i := 0 to x  - 1 do
    begin
      for j := 0 to y - 1 do
      begin
        imagen  := TImage.Create(nil);
        imagen.Width := anchoImg;
        imagen.Height := altoImg;

        nameImg := IntToStr(i) + IntToStr(j) + '.bmp';

        str := 'Copiando ' + nameImg + ' Izq: ' + IntToStr(izq) + ' arr: ' + IntToStr(arr) +
             ' der: ' + IntToStr(der) + ' aba: ' + IntToStr(aba);
        Memo1.Lines.Add(str);

        imagen.Picture.LoadFromFile(nameImg);
        ARect.Left := izq;
        ARect.Top := arr;
        ARect.Right := der;
        ARect.Bottom := aba;

        map.Canvas.CopyRect(ARect, imagen.Canvas, imagen.ClientRect);

        arr := arr + AnchoImg;
        aba := aba + altoImg;

        imagen.Free;
      end;
        arr := 0;
        aba := altoImg;
        izq := izq + anchoImg;
        der := der + anchoImg;
        Memo1.Lines.Add(' ================ ');
    end;
  path := ChangeFileExt(Application.ExeName, '.bmp');
  map.Picture.SaveToFile(path);
  MessageDlg('Se ha guardado la imagen con el nombre: ' + path, mtInformation, [mbOK], 0);

Ahora quisiera saber cómo hacer lo mismo pero con imágenes jpg.. y luego guardarlo con el formato que yo quiera.

para que funcione se necesitan 4 imágenes de 50 x 50 llamadas, 00.bmp, 01, 10, 11.bmp. así pegará primero 00, luego abajo el 01, luego arriba a la derecha el 10, y abajo el 11, igual servirá para más de 4 imágenes, solo hay que modificar los valores de x , y

¿Qué les parece?
¿Cómo podría mejorarla?

Saludos!

BlackDaemon 03-03-2009 00:50:55

Hola

bueno, yo mismo me responderá a la pregunta de como hacer para que funcione con sun jpg, lo que tenemos que usas son las funciones Draw o StretchDraw y no CopyRec que según he leido solo sirve si tienes cargado un .bmp, como es el caso, por eso si quería poner una jpg me daba una excepción.

Saludos!

Neftali [Germán.Estévez] 03-03-2009 12:25:10

Creo que esta correcto. Me refiero que básicamente hace lo que tiene que hacer y no veo grandes mejoras.

Al final siempre puedes aplicar cambios a la imagen, ya sea de formato, para grabarlo en otro, cambios de tamaño, efectos,....

BlackDaemon 03-03-2009 13:01:34

Hola

Bueno, usando Draw he simplificado un poco el código, ya que no uso tantas variables como arr, aba, der, izq, tampoco esto
ARect : TRect;

Solo le doy la pocición de X, Y y listo, al menos parece más fácil.

pero tengo una duda, en este código:

Código Delphi [-]
var
R: TRect;
begin
  with Canvas do
  begin
    R.Left := 300;
    R.Top := 250;
    R.Right := 350;
    R.Bottom := 300;
    Brush.Color := clGreen;
    FrameRect( R );
    Draw( 100, 100, Imagen.Picture.Graphic );
  end;
end;

Para qué serviría R.Left, R.Top, etc? supuestamente para la posición de donde se copiará
la nueva imágen, verdad? Pero entonces qué es 100, 100 ? No es eso la nueva posición ?

Saludos!


La franja horaria es GMT +2. Ahora son las 07:10:57.

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