Usar TImage em tempo de execução

30/03/2006

Olá, estou precisando manipular um TImage, mas sme mandá-lo para o formulário. Para isso eu deverei usá-lo em tempo de execução. Mas o meu problema é que eu tento instanciar um objeto da classe TImage (TImage.Create(Imagem1); , por exemplo) e na hora de executar Imagem1.Picture.LoadFromFile(caminho) dá erro de execução. O que estou fazendo de errado? Outra pergunta: dá para eu manipular imagens jpeg em TImage? Se não, como eu deveria fazer para convertê-la e depois desconverter? Valeu!


Iuri

Respostas

30/03/2006

Michael

Olá!

A forma que vc mostrou para instanciar um objeto da classe [b:43e4c9dac0]TImage [/b:43e4c9dac0]está estranha. O [b:43e4c9dac0]Owner [/b:43e4c9dac0]informado no construtor não deveria ser o próprio objeto, e sim outro.

Se vc sabe o tempo de vida do componente, isto é, se é vc quem vai criá-lo e destruí-lo - como parece ser o seu caso - então use [b:43e4c9dac0]nil [/b:43e4c9dac0]no construtor:

var
  Imagem: TImage;
begin
  Image := TImage.Create(nil);
  try
    // Faz alguma coisa com Imagem
  finally
    Imagem.Free;
  end;
end;


Porém, se vc só quiser manipular imagens, pode usar a classe [b:43e4c9dac0]TPicture [/b:43e4c9dac0]ao invés de [b:43e4c9dac0]TImage[/b:43e4c9dac0]. Ela permite manipular arquivos vários arquivos de imagens, inclusive JPEG (inclua a unit [b:43e4c9dac0]JPEG [/b:43e4c9dac0]na cláusula uses do seu código).

Se quiser trabalhar somente com imagens JPEG, então use a classe [b:43e4c9dac0]TJPEGImage[/b:43e4c9dac0], localizada tbm na unit [b:43e4c9dac0]JPEG[/b:43e4c9dac0].

Por fim, para converter JPEG para Bitmaps, e vice-versa, basta usar o método [b:43e4c9dac0]Assign[/b:43e4c9dac0]:

var
  Bitmap: TBitmap;
  Jpg: TJPEGImage;
begin
  Bitmap := TBitmap.Create;
  Jpg := TJPEGImage.Create;
  try
    Bitmap.LoadFromFile(´Arquivo.bmp´);
    Jpg.Assign(Bitmap);
    Jpg.SaveToFile(´Arquivo.jpg´);
  finally
    Bitmap.Free;
    Jpg.Free;
  end;
end;


[]´s


Responder Citar

30/03/2006

Iuri

Puxa, muito obrigado mesmo, me esclareceu bastante! Só me resta mais uma pequena dúvida: tem como ter acesso a cada um dos pixels usando a TJPEGImage? Valeu mesmo!
abs


Responder Citar

30/03/2006

Iuri

A forma de instanciar eu acabei descobrindo uns minutos atrás (conforme coloquei naquele outro tópico), contudo eu não consegui apagá-lo. Tem como apagar mensagens minhas nesse fórum? É que eu não queria atrapalhar com mensagens inúteis (sem querer coloquei 2 mensagens iguais). Obrigado


Responder Citar

30/03/2006

Iuri

No fim decidi usar a classe TPicture (adicionei jpeg ao ´uses´), mas houve um problema: como eu desejo acessar pixel a pixel, preciso pegar a linha usando o Scanline, mas ele só é acessável se eu usar o comando imagem.Bitmap.Scanline[y], mas eu acesso imagens jpeg. Tem um jeito de eu dar um scan na linha inteira da minha imagem sem usar o Scanline?
Ou o único modo de eu resolver o meu problema é convertendo a imagem para bitmap, manipulando e enfim reconvertendo para jpeg? Valeu!


Responder Citar

30/03/2006

Massuda

...mas ele só é acessável se eu usar o comando imagem.Bitmap.Scanline[y], mas eu acesso imagens jpeg.
Isso não é problema. O formato de uma imagem afeta somente como ela é armazenada em disco. Uma vez carregado no TImage/TPicture, todas as imagens são bitmaps, pois o Windows só sabe lidar com bitmaps.


Responder Citar

30/03/2006

Iuri

Certo, então. Obrigado pelos esclarecimentos!


Responder Citar

31/03/2006

Iuri

Houve um problema: não adianta mesmo, se a extensão é jpeg eu não consigo usar o Scanline, diz que o ´Scan line index out of range´. Aí eu tive que recorrer à conversão no modo que você me havia sugerido.
Mas aí houve um outro problema: ao converter o JPEGImage para o Bitmap e mandar fazer um método que fazia corretamente quando carregava do TImage no form (o método interpolava duas imagens e mandava pra um terceira), o método não funciona, acho que por causa de algum erro na hora da conversão, pois quando mando o bitmap diretamente, sem converter o jpegimage para bitmap, funciona de forma correta.
Pus o código para ficar mais claro:


function Classe.Interpolar(imagem1, imagem2 : TBitmap) : TBitmap;

      var x,y   : integer;
          Pixel, Pixel2, Pixel3 : PByte;
          imagem3 : TBitmap;
      begin
        imagem3 := TBitmap.Create;
        imagem3.LoadFromFile(´x.bmp´);
        x := 0;
        for y := 0 to imagem1.Height-1 do
        begin
          Pixel := imagem1.Scanline[y&93;;
          Pixel2 := imagem2.Scanline&91;y&93;;
          Pixel3 := imagem3.Scanline&91;y&93;;
          while x <> (imagem1.Width-1) do
          begin
            Pixel3^ := round((Pixel^ + Pixel2^)/2);
            inc(Pixel);
            inc(Pixel2);
            inc(Pixel3);
            inc(x);
          end;

        end;
        Result := imagem3;
      end;


Valeu de novo!


Responder Citar

01/04/2006

Kroki

Que tipo de manipulação vc quer fazer na image?


Responder Citar

05/04/2006

Iuri

A manipulação que eu desejo fazer é a explicitada acima, ou seja, a interpolação (geração de uma terceira imagem, resultante da fusão das duas iniciais) de imagens. Alguém saberia o que tenho de fazer para converter da TJPEGImage para o TBitmap e poder usar o algoritmo acima? Obrigado


Responder Citar

05/04/2006

Massuda

No seu código exemplo, não entendi porque você carrega imagem3 a partir de um arquivo.

Assumindo que imagem1 e imagem2 tem o mesmo tamanho, bastaria fazer...
...
imagem3 := TBitmap.Create; 
imagem3.Width := imagem1.Width;
imagem3.Height := imagem1.Height;
...
...seu código original sempre dará problemas se as imagens tiverem tamanhos diferentes.


Responder Citar

05/04/2006

Christian_adriano

{ Converte uma Imagem Jpeg (jpg) para BMP }
procedure ConverteJpegToBmp(Img: TImagem);
var
  Jpeg: TJPEGImage;
  bmp: TBitmap;
begin
  Jpeg := TJPEGImage.Create;
  try
      Jpeg.CompressionQuality := 20;
      Jpeg.Assign(Img.Picture.Graphic);
      Jpeg.PixelFormat := TJPEGPixelFormat(0); {0 = 8Bits / 1 = 24Bits}
      Jpeg.GrayScale := True; {Apenas tons de cinza}
      Jpeg.Performance := TJPEGPerformance(0); {0 = Baixa Resolução / 1 = AltaResolução}
      Jpeg.ProgressiveDisplay := True; {Display Progressivo}
      bmp := TBitmap.Create;
      bmp.Assign(Jpeg);
      { .....................................
         ..................................... }
  finally
      FreeAndNil(Jpeg);
      FreeAndNil(bmp);
  end;
end;


Espero q ajude.

[]´s.


Responder Citar

07/04/2006

Iuri

Muito obrigado pela ajuda de vocês! Arrumei um outro meio de fazer isso, mas vocês me foram de grande ajuda. Valeu!


Responder Citar

18/09/2006

Pabresco

Olá pessoal estou com um problema no componente Timage. Eu estou ao clicar no Timage, é aberta a tela para busca de uma image, eu escolho a image e ao clicar no botão gravar, que é apresentada na aplicação q eu mesmo criei, o caminho da foto é salvo no banco de dados em um campo varchar. A foto é apresentada perfeitamente, sendo q quando eu fecho o aplicativo, a imagem não aparece mais no Timage, ele fica em branco, sendo q o caminho está salvo no banco de dados.

Eu uso Delphi 7 e interBase 7.5.

Ficarei muito grato se alguém puder me ajudar.

Abraços![/img]


Responder Citar