Hola! , soy nuevo en el foro, anque lo vengo leyendo hace bastante.
Tengo una consulta sobre un procedimiento que encontre en internet.
http://www.saiyine.com/post.471.php?tags=+DELPHI+
El mismo lo que hace es concatenar imagenes de igual tamaño de izquierda a derecha de menor a mayor, formando una tira, o sea que la imagen mas chica va a quedar en la izquierda y la mas grande en la derecha.
las imagenes las toma de un tstringlist, de ahi saca la lista.
Cuando me refiero a mas chica o mas grande es el nombre que lleva, que es un numero.
Lo que yo necesito es concatenar las imagenes de igual manera pero de abajo hacia arriba, de menor a mayor, quedando la imagen mas chica abajo de todo y la mas grande arriba.
Modifique el codigo en algunas lineas y pude obtener como resultado que el procedimiento cree la tira de forma vertical, e inserte las imagenes chicas formando la tira, pero lo que no puedo lograr es que lo haga en el orden correcto.
Lo que logro es colocar la mas chica arriba de todo y la mas grande abajo. sospecho que esto pasa porque el procedimiento crea la tira de arriba hacia abajo en lugar de hacerlo de abajo hacia arriba.
Necesitaria una solucion en la que los datos se sigan cargando en el tstrinlist de igual manera, a lo que me refiero es que no me serviria cargar las imagenes en el tstringlist al revez para solucionar el problema
Les dejo el codigo original, el codigo modificado por mi y los procedimientos y funciones utilizadas
procedimiento original:
Código:
// GrabarJPG('resultado.jpg',sumar_jpg_de_lado(memo1.lines));
function sumar_jpg_de_lado(nombres : tstrings) : TBitmap;
var
b : array [0..10] of tbitmap; // limite de JPGs laterales, subir si hace falta
c,x,y,i,j,k : integer;
begin
c:=nombres.count;
for i:=0 to c-1 do b[i]:=LeerJPG(nombres[i]);
// ATENCION: Es para n JPGs de dimesiones identicas
x:=b[0].width;
y:=b[0].height;
result:=CrearBitmap(x*c,y);
for i:=0 to x-1 do
for j:=0 to y-1 do
for k:=0 to c-1 do
result.canvas.Pixels[i+k*x,j]:=b[k].canvas.pixels[i,j];
end;
Mi programa completo (aca puede encontrar los procedimientos y funciones faltantes)
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,jpeg;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function LeerJPG(n : string) : TBitmap;
Var
jpeg: TJPEGImage;
Begin
jpeg:= TJPEGImage.Create;
try
jpeg.LoadFromFile(n);
result:= TBitmap.Create;
try
result.Assign( jpeg );
finally
end;
finally
jpeg.free
end;
end;
function CrearBitmap(tamx,tamy : integer) : TBitmap;
begin
result:=TBitmap.Create;
result.Height:=tamy;
result.Width:=tamx;
result.PixelFormat := pf24Bit;
end;
function sumar_jpg_de_lado(nombres : tstrings) : TBitmap;
var
b : array [0..10] of tbitmap; c,x,y,i,j,k : integer;
begin
c:=nombres.count;
for i:=0 to c-1 do b[i]:=LeerJPG(nombres[i]);
x:=b[0].width;
y:=b[0].height;
result:=CrearBitmap(x,y*c); for i:=0 to x-1 do
for j:=0 to y-1 do
for k:=0 to c-1 do
result.canvas.Pixels[i,j+k*y]:=b[k].canvas.pixels[i,j]; end;
procedure GrabarJPG(n : string; d : TBitmap);
Var
jpeg: TJPEGImage;
Begin
jpeg:= TJPEGImage.Create;
jpeg.Assign( d ); jpeg.savetofile(n); jpeg.free
end;
procedure TForm1.Button1Click(Sender: TObject);
var
searchResult : TSearchRec;
begin
SetCurrentDir('E:\Xplane\Fotoreal\sadf\Nueva carpeta');
memo1.clear;
if FindFirst('*.jpg', faAnyFile, searchResult) = 0 then begin
repeat
Memo1.Lines.Add(searchresult.name);
until FindNext(searchResult) <> 0;
FindClose(searchResult);
end;
GrabarJPG('resultado.jpg',sumar_jpg_de_lado(memo1.lines));
memo1.lines.add('resultado.jpg');
end;
end.
espero la respuesta, gracias!