Fusão de JPG´s

Delphi

04/08/2003

A dúvida é a seguinte: Tenho 4 arquivos jpg e preciso unir esses arquivos em um só, via programação, gerando assim um terceiro arquivo que seria como um ´retrato´ dos 4 lado a lado. Se alguém puder ajudar, agradeço.


Earmarques

Earmarques

Curtidas 0

Respostas

Robotizar

Robotizar

04/08/2003

Olha só amigo
vc pode usar um Timage usar o comando draw e depois salvar
não estou com o delphi aberto por isso os códigos podem estar errados mais vou dizer mais ou menos

Suponhamos que vc tenha 4 img de 32 X 32
ponha um Timage de 64 X 64vou chamalo de tela
e as quatros img vc tem que carregar em variaveis do tipo bitmap
ponha os seguintes comandos
TEla.canvas.draw(0,0,BMp1);
Tela.canvas.draw(32,0,BMP2);
tela.canvas.draw(0,32,Bmp3);
tela.canvas.draw(32,32,Bmp4);

assim ele carregara as quatros imgs no Timage depois basta salvar
naum sei o comando ao certo acho q é
Tela.picture.bitmap.saveTofile(´C:\Fotos.bmp´);

acho q é isso amigo
abraços


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

04/08/2003

Seguindo o mesmo principio do Robotizar...

Declare [color=blue:6fa1abd5f6]JPEG [/color:6fa1abd5f6]no [b:6fa1abd5f6]uses[/b:6fa1abd5f6]

function MesclaJpgs(Jpg1, Jpg2, Jpg3, Jpg4 : TGraphic): Tgraphic;
var
  NumX, NumY : integer;
  BMP : TBitmap;
begin
BMP := TBitmap.Create;
try
  with BMP do
   begin
    if (Jpg1.Width + Jpg2.Width) > (Jpg3.Width + Jpg4.Width) then
      Width := Jpg1.Width + Jpg2.Width
    else
      Width := Jpg3.Width + Jpg4.Width;
    if (Jpg1.Height + Jpg3.Height) > (Jpg2.Height + Jpg4.Height) then
      Height := Jpg1.Height + Jpg2.Height
    else
      Height := Jpg3.Height + Jpg4.Height;
    if JPG1.Width > JPG3.Width then
      NumX := Jpg1.Width
    else
      NumX := Jpg3.Width;
    if JPG1.Height > JPG2.Height then
      NumY := Jpg1.Height
    else
      NumY := Jpg2.Height;
    Canvas.Draw(0,0, Jpg1);
    Canvas.Draw(NumX,0, Jpg2);
    Canvas.Draw(0,NumY, Jpg3);
    Canvas.Draw(NumX,NumY, Jpg4);
   end;
  Result := TJPEGImage.Create;
  Result.Assign(BMP);
finally
  BMP.Free;
end;
end;


e use ela assim:
para teste, coloque 5 [color=red:6fa1abd5f6]Images [/color:6fa1abd5f6]no form, altere a propriedade [color=red:6fa1abd5f6]Strech [/color:6fa1abd5f6]e [color=red:6fa1abd5f6]Proportional [/color:6fa1abd5f6]para [color=blue:6fa1abd5f6]True[/color:6fa1abd5f6]

nos [color=red:6fa1abd5f6]Images [/color:6fa1abd5f6]1,2,3,4 coloque diferentes imagens, e claro, elas tem que ser JPGs ou JPEGs, e o 5 deixe em branco;
coloque um botão(´Mesclar´), e no evento on click:
  Image5.Picture.Graphic := MesclaJpgs(Image1.Picture.Graphic,Image2.Picture.Graphic,Image3.Picture.Graphic,Image4.Picture.Graphic);


testei ela inclusive com Imagens de Tamanhos diferentes, e ela se mostrou eficaz, caso queira salvar, faça um [i:6fa1abd5f6]Image5.SavetoFile(´Arquivo.jpg´);[/i:6fa1abd5f6]
mas você não presisa realmente do Image5, usei apenas como exemplo, caso não queira exibir a imagem e salvar direto pode usar esse código:


MesclaJpgs(Image1.Picture.Graphic,Image2.Picture.Graphic,Image3.Picture.Graphic,Image4.Picture.Graphic).SavetoFile(´Imagem.jpeg´);


[color=green:6fa1abd5f6][b:6fa1abd5f6]--------------------------------------------[/b:6fa1abd5f6][/color:6fa1abd5f6]Explicando a função:

function MesclaJpgs(Jpg1, Jpg2, Jpg3, Jpg4 : TGraphic): TGraphic;
var
  NumX, NumY : integer;
  BMP : TBitmap;
begin


[color=darkblue:6fa1abd5f6]A função Retorna um Graphic, que é o tipo que armazena os JPEGs nos Images;
NumX, NumY é a posição do meio, onde o 4º JPG será desenhado[/color:6fa1abd5f6]


BMP := TBitmap.Create;
try
  with BMP do
   begin
    if (Jpg1.Width + Jpg2.Width) > (Jpg3.Width + Jpg4.Width) then
      Width := Jpg1.Width + Jpg2.Width
    else
      Width := Jpg3.Width + Jpg4.Width;
    if (Jpg1.Height + Jpg3.Height) > (Jpg2.Height + Jpg4.Height) then
      Height := Jpg1.Height + Jpg2.Height
    else
      Height := Jpg3.Height + Jpg4.Height;
    if JPG1.Width > JPG3.Width then
      NumX := Jpg1.Width
    else
      NumX := Jpg3.Width;
    if JPG1.Height > JPG2.Height then
      NumY := Jpg1.Height
    else
      NumY := Jpg2.Height;

[color=darkblue:6fa1abd5f6]BMP := TBitmap.Create; Criamos um lugar aonde desenhar as imagem, antes de passar como resultado da função, uso o BMP por poder usar o canvas dele[/color:6fa1abd5f6]

if (Jpg1.Width + Jpg2.Width) > (Jpg3.Width + Jpg4.Width) then
      Width := Jpg1.Width +  ..........  ight := Jpg3.Height + Jpg4.Height;
[color=darkblue:6fa1abd5f6]
isto calcula o tamanho final da imagem, o tamanho que vai ficar quando unir as 4 Imagens[/color:6fa1abd5f6]

if JPG1.Width > JPG  ........   Jpg2.Height; 

[color=darkblue:6fa1abd5f6]Isso calcula o ´meio´da imagem[/color:6fa1abd5f6]

    Canvas.Draw(0,0, Jpg1);
    Canvas.Draw(NumX,0, Jpg2);
    Canvas.Draw(0,NumY, Jpg3);
    Canvas.Draw(NumX,NumY, Jpg4);


[color=darkblue:6fa1abd5f6]Desenhamos os JPEGs na variavel BMP[/color:6fa1abd5f6]

  Result := TJPEGImage.Create;
  Result.Assign(BMP);
finally
  BMP.Free;


[color=darkblue:6fa1abd5f6]Passamos o BMP como resultado, só que transformamos ele de BMP (Bitmap) para um Tipo Graphic (no caso JPG ou JPEG)[/color:6fa1abd5f6]
BMP.Free; [color=darkblue:6fa1abd5f6]Liberamos o nosso BMP[/color:6fa1abd5f6]

Espero ter ajudado :wink:


GOSTEI 0
POSTAR