Usar TImage em tempo de execução
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
Curtidas 1
Respostas
Michael
30/03/2006
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:
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]:
[]´s
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
GOSTEI 0
Iuri
30/03/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
abs
GOSTEI 0
Iuri
30/03/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
GOSTEI 0
Iuri
30/03/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!
Ou o único modo de eu resolver o meu problema é convertendo a imagem para bitmap, manipulando e enfim reconvertendo para jpeg? Valeu!
GOSTEI 0
Massuda
30/03/2006
...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.GOSTEI 0
Iuri
30/03/2006
Certo, então. Obrigado pelos esclarecimentos!
GOSTEI 0
Iuri
30/03/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:
Valeu de novo!
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]; 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!
GOSTEI 0
Kroki
30/03/2006
Que tipo de manipulação vc quer fazer na image?
GOSTEI 0
Iuri
30/03/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
GOSTEI 0
Massuda
30/03/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......seu código original sempre dará problemas se as imagens tiverem tamanhos diferentes.
Assumindo que imagem1 e imagem2 tem o mesmo tamanho, bastaria fazer...
... imagem3 := TBitmap.Create; imagem3.Width := imagem1.Width; imagem3.Height := imagem1.Height; ...
GOSTEI 0
Christian_adriano
30/03/2006
{ 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.
GOSTEI 0
Iuri
30/03/2006
Muito obrigado pela ajuda de vocês! Arrumei um outro meio de fazer isso, mas vocês me foram de grande ajuda. Valeu!
GOSTEI 0
Pabresco
30/03/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]
Eu uso Delphi 7 e interBase 7.5.
Ficarei muito grato se alguém puder me ajudar.
Abraços![/img]
GOSTEI 0