프로젝트 때문에 사진을 데이터베이스에 저장하고 필요할 때 데이터베이스에서 읽어야 했는데 처음에는 아주 간단하다고 생각했는데, 사실 그냥 보기에도 매우 간단했습니다. 코드가 많지만 , 모두 함정입니다!
TImage의 소스를 살펴보세요. Picture.Graphic 아래에 loadfromStream과 SavetoStream이 있습니다. 올바르게 추측했다면 이 두 가지 기능을 사용하면 됩니다. 그래서 데모 테스트를 만들었습니다.
데모에는 두 개의 TImage가 있습니다. TImage1은 사진을 넣은 다음 코드를 사용하여 TImage1의 사진을 Stream.TImage2에 저장한 다음 이 Stream에서 사진을 가져옵니다.
이것은 내 코드입니다.
PicStream:=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream):=0; Self.Image2.Picture.Graphic.loadFromStream(PicStream.Free);
그런데 사실은 오류가 있어서 바이두를 검색해봐도 마찬가지였습니다. (인터넷에 왜 이렇게 문제 있는 코드가 많은지 모르겠습니다. 버전이 다르기 때문일까요?)
그래서 TPicture.Assign을 직접 사용하여 Timage1을 복사하면 오류가 없기 때문에 그의 TPicture.Assign을 추적했습니다.
절차 TPicture.Assign(Source: TPerpersist); Source = nil인 경우 시작하고 SetGraphic(nil) else인 경우 Source가 TPicture인 경우 SetGraphic(TPicture(Source).Graphic) 그렇지 않은 경우 Source가 TGraphic인 경우 SetGraphic(TGraphic(Source))인 경우 상속됨 할당(소스);끝;
그가 Assign을 호출하면 SetGraphic을 호출하여 TGraphic 개체를 생성하게 됩니다.
따라서 여전히 Graphic.loadFromStream 함수를 사용하려면 TGraphic 개체를 직접 생성해야 하며 그렇지 않으면 문제가 발생할 수 있습니다. 또한 다른 이미지 형식에 따라 다른 ClassType을 호출하여 TGraphic을 생성해야 합니다. 좀 더 귀찮습니다. 그리고 TJPEGImage 개체를 사용했는데 LoadFromStream을 호출하면 Stream을 직접 읽을 수 있어서 한동안 게으릅니다.
Jpg:=TJPEGImage.Create; PicStream:=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream.Position:=0; Self.Image2.Picture.Assign(JPg) ); PicStream.Free;
저는 책을 많이 읽지 않습니다. 독자 여러분, 처음에는 이 블로그를 쓰고 싶지 않았습니다. 그러나 웹 사이트의 코드는 D10에서 사용할 수 없습니다. .그래서 나는 바보가 되었다.