Por causa de um projeto, tive que salvar as imagens no banco de dados e lê-las no banco de dados quando necessário. A princípio achei muito simples, não apenas um Stream. Na verdade, também é muito simples. isso, existem muitos códigos, mas são todos armadilhas!
Dê uma olhada na fonte do TImage. Existem loadfromStream e SavetoStream em Picture.Graphic. Se você adivinhou corretamente, você pode simplesmente usar essas duas funções.
Existem duas TImages na demonstração que TImage1 contém uma imagem e, em seguida, o código é usado para salvar a imagem de TImage1 em Stream.TImage2 e, em seguida, tirar a imagem deste Stream.
Este é o meu código.
PicStream:=TMemoryStream.Create;
Mas, na verdade, ele cometeu um erro. Então pesquisei no Baidu várias vezes e o resultado foi o mesmo (não entendo por que existem tantos códigos problemáticos na Internet. É por causa de versões diferentes?)
Então rastreei seu TPicture.Assign porque se eu usar TPicture.Assign diretamente para copiar Timage1, não haverá erro.
procedimento TPicture.Assign (Fonte: TPersistent); comece se Fonte = nil então SetGraphic(nil) senão se Fonte for TPicture então SetGraphic(TPicture(Fonte).Graphic) senão se Fonte for TGraphic então SetGraphic(TGraphic(Fonte)) senão herdado Atribuir(Fonte);fim;
Acontece que quando ele chama Assign, ele chama SetGraphic para criar um objeto TGraphic.
Portanto, se eu ainda quiser usar a função Graphic.loadFromStream, devo criar manualmente o objeto TGraphic, caso contrário, algo definitivamente dará errado. Além disso, o TGraphic deve ser criado chamando diferentes ClassTypes de acordo com diferentes formatos de imagem. é problemático. Um pouco mais. E eu usei um objeto TJPEGImage, e chamar seu LoadFromStream pode ler diretamente o Stream, então fiquei preguiçoso por um tempo.
Jpg:=TJPEGImage.Create;=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream.Position:=0; );
Não leio muitos livros. Este blog é estranho. Leitores, vou me contentar com isso. No começo, não queria escrever este blog. Mas vi que o código do site não pode ser usado no D10. .Então eu fiz papel de bobo.