เนื่องจากเป็นโปรเจ็กต์ ฉันต้องบันทึกรูปภาพลงฐานข้อมูลและอ่านจากฐานข้อมูลเมื่อจำเป็น ตอนแรกฉันคิดว่ามันง่ายมาก ไม่ใช่แค่สตรีมเท่านั้น มันมีรหัสมากมาย แต่ล้วนเป็นข้อผิดพลาด!
ดูที่มาของ TImage มี loadfromStream และ SavetoStream อยู่ใต้ Picture.Graphic หากคุณเดาถูก คุณสามารถใช้ทั้งสองฟังก์ชันนี้ได้ ดังนั้นฉันจึงทำการทดสอบสาธิต
มี TImage สองภาพในการสาธิต TImage1 ใส่รูปภาพ จากนั้นใช้โค้ดเพื่อบันทึกรูปภาพของ TImage1 ไปยัง Stream.TImage2 จากนั้นนำรูปภาพจาก Stream นี้ไปโดยอัตโนมัติ
นี่คือรหัสของฉัน
PicStream:=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream); PicStream.Position:=0; Self.Image2.Picture.Graphic.loadFromStream(PicStream);
แต่ในความเป็นจริงเขาทำผิดพลาด ดังนั้นฉันจึงค้นหา Baidu ซ้ำแล้วซ้ำเล่า (ฉันไม่เข้าใจว่าทำไมจึงมีรหัสที่มีปัญหามากมายบนอินเทอร์เน็ต เป็นเพราะเวอร์ชันที่แตกต่างกันหรือไม่)
ดังนั้นฉันจึงติดตาม TPicture.Assign ของเขา เพราะหากฉันใช้ TPicture.Assign เพื่อคัดลอก Timage1 โดยตรง ก็ไม่มีข้อผิดพลาด
ขั้นตอน TPicture.Assign(Source: TPersistent);เริ่มต้นถ้า Source = nil แล้ว SetGraphic(nil) else ถ้า Source เป็น TPicture แล้ว SetGraphic(TPicture(Source).Graphic) else ถ้า Source เป็น TGraphic แล้ว SetGraphic(TGraphic(Source)) อย่างอื่นสืบทอดมา กำหนด(ที่มา);สิ้นสุด;
ปรากฎว่าเมื่อเขาเรียก Assign เขาจะเรียก SetGraphic เพื่อสร้างวัตถุ TGraphic
ดังนั้นหากฉันยังต้องการใช้ฟังก์ชัน Graphic.loadFromStream ฉันต้องสร้างออบเจ็กต์ TGraphic ด้วยตนเอง มิฉะนั้นจะมีข้อผิดพลาดเกิดขึ้นอย่างแน่นอน นอกจากนี้ ต้องสร้าง TGraphic โดยการเรียก ClassTypes ที่แตกต่างกันตามรูปแบบรูปภาพที่แตกต่างกัน ลำบากอีกหน่อย และผมใช้ object TJPEGImage และการเรียก LoadFromStream ก็สามารถอ่าน Stream ได้โดยตรง ผมก็เลยขี้เกียจไปพักหนึ่ง
Jpg:=TJPEGImage.Create; PicStream:=TMemoryStream.Create; Self.Image2.Picture.Assign(JPg ); PicStream ฟรี;
ฉันไม่ได้อ่านหนังสือมากนัก บล็อกนี้แปลก ฉันไม่อยากเขียนบล็อกนี้ในตอนแรก แต่ฉันเห็นว่ารหัสของเว็บไซต์ไม่สามารถใช้ภายใต้ D10 . ฉันจึงทำตัวโง่เขลา.