Esto es un poco más complejo, voy a explicar por que:
Como usamos un TImage y su propiedad canvas, al momento de darle una imagen a ésta su tamaño queda fijo y si queremos añadir la siguiente imagen no podremos verla ya que quedará fuera de los limites, por lo tanto tenemos que destruir el TImage y crearlo de nuevo con un nuevo tamaño, que sería el que tiene actualmente más la altura de la nueva imagen, les recuerdo que las imagenes que yo utilizo son escaenadas y por lo tanto tiene siempre las mismas longitudes de altura y anchura.
Ahí va pues:
En este caso "ImageHolder" no lo declaramos ya que lo creamos en tiempo de ejecución
procedure TForm1.FormCreate(Sender: TObject);
begin
y_last:=0;
end;
Tenemos el mismo evento del boton para escanear que en la anterior respuesta
procedure TForm1.GoAcquireClick(Sender: TObject);
var
SelectedSource: Integer;
begin
if Twain.LoadLibrary then
begin
Twain.SourceManagerLoaded := TRUE;
SelectedSource := 1;//Twain.SelectSource;{ En esta linea la parte que no está en comentarios toma de la lista de fuentes de imagenes la segunda opción, la cual es por medio del asistente de windows,esta lista varía segun los programas de escaneo que tengamos así como el número de escaneres que tengamos, la linea que está entre comentarios abre una lista de fuentes de imagenes, podemos seleccionar la que queramos }
if SelectedSource <> -1 then
begin
Twain.Source[SelectedSource].Loaded := TRUE;
Twain.Source[SelectedSource].TransferMode := ttmMemory;
Twain.Source[SelectedSource].ShowUI:=false;{Como seleccionamos como fuente, en este ejemplo, el asistente de windows ocultamos la interfáz con ella, esta linea se puede omitir para seleccionar entre varias opciones como:resolución, color o b/n, etc..; Yo la omito porque las imagenes que adquiero las necesito en b/n}
Twain.Source[SelectedSource].Enabled := TRUE;
end
end
else
showmessage('Twain is not installed.');
end;
Ahora viene el cambio dentro del evento TwainAcquire, declaramos dos variables enteras: x,y
procedure TForm1.TwainTwainAcquire(Sender: TObject; const Index: Integer;
Image: TBitmap; var Cancel: Boolean);
var x,y:integer;
begin
inc(n);//n lo inicializamos en 0 al crearse la aplicación
MyRect:=Rect(0,0,Image.Width,Image.Height);
MyOther:=Rect(0,MyOther.Bottom,Image.Width,Image.Height+y_last);
{Primero checamos que el componete TImage que necesitamos exista, y si no lo creamos, en la siguiente sentencia "if"}
If (FindComponent('ImageHolder'))=nil then begin
TImage.Create(Self).Name:='ImageHolder';
TImage(FindComponent('ImageHolder')).Top:=104;
TImage(FindComponent('ImageHolder')).Left:=24;
TImage(FindComponent('ImageHolder')).Width:=Form1.ClientWidth-50;
TImage(FindComponent('ImageHolder')).Height:=Form1.ClientHeight-129;
TImage(FindComponent('ImageHolder')).Stretch:=true;
TImage(FindComponent('ImageHolder')).Parent:=self;
TImage(FindComponent('ImageHolder')).Anchors:=[akLeft,akTop,akRight,akBottom];
end;
x:=TImage(FindComponent('ImageHolder')).Width;
y:=TImage(FindComponent('ImageHolder')).Height;
{La siguiente linea es para ejecutar el codigo ya que sea la segunda imagen que agregamos}
if n<>1 then begin
TImage(FindComponent('ImageHolder')).Width:=Image.Width;
TImage(FindComponent('ImageHolder')).Height:=y_last;
TImage(FindComponent('ImageHolder')).Stretch:=false;
TImage.Create(Self).Name:='ImageAux';
TImage(FindComponent('ImageAux')).Top:=104;
TImage(FindComponent('ImageAux')).Left:=24;
TImage(FindComponent('ImageAux')).Width:=TImage(FindComponent('ImageHolder')).Width;
TImage(FindComponent('ImageAux')).Height:=TImage(FindComponent('ImageHolder')).Height;
TImage(FindComponent('ImageAux')).Stretch:=true;
TImage(FindComponent('ImageAux')).Parent:=self;
TImage(FindComponent('ImageAux')).Anchors:=[akLeft,akTop,akRight,akBottom];
TImage(FindComponent('ImageAux')).Canvas.BrushCopy(rect(0,0,TImage(FindComponent('ImageHolder')).Width,
TImage(FindComponent('ImageHolder')).Height),
TImage(FindComponent('ImageHolder')).Picture.Bitmap,
rect(0,0,TImage(FindComponent('ImageHolder')).Width,
TImage(FindComponent('ImageHolder')).Height)
,clnone);
TImage(FindComponent('ImageHolder')).Destroy;
If (FindComponent('ImageHolder'))=nil then begin
TImage.Create(Self).Name:='ImageHolder';
//with TImage(FindComponent('ImageHolder')) do begin
TImage(FindComponent('ImageHolder')).Top:=104;
TImage(FindComponent('ImageHolder')).Left:=24;
TImage(FindComponent('ImageHolder')).Width:=TImage(FindComponent('ImageAux')).Width;
TImage(FindComponent('ImageHolder')).Height:=TImage(FindComponent('ImageAux')).Height+image.Height;
TImage(FindComponent('ImageHolder')).Stretch:=true;
TImage(FindComponent('ImageHolder')).Parent:=self;
TImage(FindComponent('ImageHolder')).Anchors:=[akLeft,akTop,akRight,akBottom];
//end;
end;
TImage(FindComponent('ImageHolder')).Canvas.BrushCopy(rect(0,0,TImage(FindComponent('ImageAux')).Width,
TImage(FindComponent('ImageAux')).Height),
TImage(FindComponent('ImageAux')).Picture.Bitmap,
rect(0,0,TImage(FindComponent('ImageAux')).Width,
TImage(FindComponent('ImageAux')).Height)
,clnone);
TImage(FindComponent('ImageAux')).Destroy;
end else begin
TImage(FindComponent('ImageHolder')).Width:=Image.Width;
TImage(FindComponent('ImageHolder')).Height:=y_last;
TImage(FindComponent('ImageHolder')).Stretch:=false;
TImage(FindComponent('ImageHolder')).Height:=(Image.Height+y_last);
end;
TImage(FindComponent('ImageHolder')).Stretch:=false;
TImage(FindComponent('ImageHolder')).Canvas.BrushCopy(MyOther,Image,MyRect,clNone);
y_last:=MyOther.Bottom;
TImage(FindComponent('ImageHolder')).Width:=x;
TImage(FindComponent('ImageHolder')).Height:=y;
TImage(FindComponent('ImageHolder')).Stretch:=true;
end;
Y por último guardamos la imagen
procedure TForm1.Button1Click(Sender: TObject);
begin
img:=TJPEGImage.Create;
Img.CompressionQuality:=60;
Img.Compress;
Img.Assign(TImage(FindComponent('ImageHolder')).Picture.Bitmap);
Img.SaveToFile('Imagen.jpg');
Img.Free;
end;
Hay que tener en cuenta que tenemos un límite de memoria en el TImage para cargar imagenes por lo tanto son limitadas dependiendo del tamaño de las mismas, yo pego imagenes de 1248x1650 y me soporta el TImage alrededor de 5 imagenes, pero de manera interna al dejar el formatpixel en 8 bits guardé una imagen de 1248x23100 sin compresión y me la dejó a un tamaño de 7.5 megas y una con la compresión del 50% de 1248x19800 en 1.74 megas asi que ustedes deciden si comprimen o no.
Si alguien tiene una duda contacteme