Array
(
)

Usar TImage em tempo de execução

Iuri
   - 30 mar 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!


Michael
   - 30 mar 2006

Olá!

A forma que vc mostrou para instanciar um objeto da classe TImage está estranha. O Owner 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 nil no construtor:

#Código

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 TPicture ao invés de TImage. Ela permite manipular arquivos vários arquivos de imagens, inclusive JPEG (inclua a unit JPEG na cláusula uses do seu código).

Se quiser trabalhar somente com imagens JPEG, então use a classe TJPEGImage, localizada tbm na unit JPEG.

Por fim, para converter JPEG para Bitmaps, e vice-versa, basta usar o método Assign:

#Código
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


Iuri
   - 30 mar 2006

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


Iuri
   - 30 mar 2006

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


Iuri
   - 30 mar 2006

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!


Massuda
   - 30 mar 2006


Citação:
...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.


Iuri
   - 30 mar 2006

Certo, então. Obrigado pelos esclarecimentos!


Iuri
   - 31 mar 2006

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:

#Código



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];
Pixel2 := imagem2.Scanline[y];
Pixel3 := imagem3.Scanline[y];
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!


Kroki
   - 01 abr 2006

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


Iuri
   - 05 abr 2006

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


Massuda
   - 05 abr 2006

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...#Código

...
imagem3 := TBitmap.Create;
imagem3.Width := imagem1.Width;
imagem3.Height := imagem1.Height;
...
...seu código original sempre dará problemas se as imagens tiverem tamanhos diferentes.


Christian_adriano
   - 05 abr 2006

#Código

{ 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.


Iuri
   - 07 abr 2006

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


Pabresco
   - 18 set 2006

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]