À cause d'un projet, j'ai dû enregistrer les images dans la base de données et les lire à partir de la base de données en cas de besoin, je pensais que c'était très simple, pas seulement un Stream. En fait, c'est aussi très simple. ça, il y a beaucoup de codes, mais, ce sont autant d'embûches !
Jetez un œil à la source de TImage. Il y a loadfromStream et SavetoStream sous Picture.Graphic. Si vous avez bien deviné, vous pouvez simplement utiliser ces deux fonctions. J'ai donc fait un test de démonstration.
Il y a deux TImages dans la démo. TImage1 contient une image, puis le code est utilisé pour enregistrer l'image de TImage1 dans Stream.TImage2, puis retirer l'image de ce Stream. Elle se mettra naturellement en place.
C'est mon code.
PicStream:=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream.Position:=0; Self.Image2.Picture.Graphic.loadFromStream(PicStream.Free);
Mais en fait, il a fait une erreur. J’ai donc cherché encore et encore sur Baidu, le résultat était le même (je ne comprends pas pourquoi il y a tant de codes problématiques sur Internet. Est-ce à cause de versions différentes ?)
J'ai donc suivi son TPicture.Assign car si j'utilise directement TPicture.Assign pour copier Timage1, il n'y a pas d'erreur.
procédure TPicture.Assign(Source: TPersistent);begin if Source = nil then SetGraphic(nil) sinon si Source est TPicture alors SetGraphic(TPicture(Source).Graphic) sinon si Source est TGraphic alors SetGraphic(TGraphic(Source)) else hérité Attribuer(Source);fin;
Il s'avère que lorsqu'il appellera Assign, il appellera SetGraphic pour créer un objet TGraphic.
Par conséquent, si je souhaite toujours utiliser la fonction Graphic.loadFromStream, je dois créer manuellement l'objet TGraphic moi-même, sinon quelque chose se passera certainement mal. De plus, le TGraphic doit être créé en appelant différents ClassTypes en fonction des différents formats d'image. C'est gênant. Et j'ai utilisé un objet TJPEGImage, et appeler son LoadFromStream peut lire directement le Stream, donc j'ai été paresseux pendant un moment.
Jpg:=TJPEGImage.Create; PicStream:=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream.Position:=0; jpg.LoadFromStream(PicStream); ); PicStream.Free;
Je ne lis pas beaucoup de livres. Ce blog est bizarre. Lecteurs, je vais me contenter de ça. Au début, je ne voulais pas écrire ce blog. Mais j'ai vu que le code du site ne pouvait pas être utilisé sous D10. . Alors je me suis ridiculisé.