Debido a un proyecto, tuve que guardar las imágenes en la base de datos y leerlas desde la base de datos cuando fuera necesario. Al principio pensé que era muy simple, no solo un Stream. De hecho, también es muy simple. Hay muchos códigos, ¡pero todos son trampas!
Eche un vistazo a la fuente de TImage. Hay loadfromStream y SavetoStream en Picture.Graphic. Si adivinó correctamente, puede usar estas dos funciones. Entonces, hice una prueba de demostración.
Hay dos TImages en la demostración. TImage1 contiene una imagen, y luego el código se usa para guardar la imagen de TImage1 en Stream.TImage2 y luego sacar la imagen de este Stream.
Este es mi código.
PicStream:=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream.Position:=0;
Pero, de hecho, cometió un error, así que busqué en Baidu una y otra vez y el resultado fue el mismo (no entiendo por qué hay tantos códigos problemáticos en Internet. ¿Se debe a diferentes versiones?).
Así que rastreé su TPicture.Assign porque si uso TPicture.Assign directamente para copiar Timage1, no hay ningún error.
procedimiento TPicture.Assign(Fuente: TPersistent);comience si Fuente = nil entonces SetGraphic(nil) de lo contrario, si la Fuente es TPicture entonces SetGraphic(TPicture(Source).Graphic) de lo contrario, si la Fuente es TGraphic entonces SetGraphic(TGraphic(Source)) en otro caso heredado Asignar(Fuente);fin;
Resulta que cuando llama a Assign, llamará a SetGraphic para crear un objeto TGraphic.
Por lo tanto, si todavía quiero usar la función Graphic.loadFromStream, debo crear manualmente el objeto TGraphic, de lo contrario, algo definitivamente saldrá mal. Además, TGraphic debe crearse llamando a diferentes ClassTypes de acuerdo con diferentes formatos de imagen. Es un poco más problemático. Y usé un objeto TJPEGImage, y llamarlo LoadFromStream puede leer directamente el Stream, así que me sentí vago por un tiempo.
Jpg:=TJPEGImage.Create; PicStream:=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream.Position:=0; jpg.LoadFromStream(PicStream); ); PicStream.Gratis;
No leo muchos libros. Este blog es extraño. Lectores, me conformaré con él al principio. No quería escribir este blog, pero vi que el código del sitio web no se puede usar bajo D10. Así que hice el ridículo.