プロジェクトのため、画像をデータベースに保存し、必要に応じてデータベースから読み込む必要がありました。最初は、ストリームだけでなく、非常に簡単だと思いました。コードはたくさんありますが、すべて落とし穴です。
TImage のソースを見てください。Picture.Graphic の下に、loadfromStream と SavetoStream があるので、この 2 つの関数を使用するだけです。
デモには 2 つの TImage があり、TImage1 には画像が含まれており、コードは TImage1 の画像を Stream.TImage2 に保存し、この Stream から画像を取り出します。
これは私のコードです。
PicStream:=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream.Position:=0);
しかし実際には、彼は間違いを犯したため、何度も Baidu を検索しましたが、結果は同じでした (なぜインターネット上に問題のあるコードがたくさんあるのかわかりません。バージョンが異なるためでしょうか?)。
そこで、TPicture.Assign を直接使用して Timage1 をコピーしても、エラーは発生しないため、彼の TPicture.Assign を追跡しました。
プロシージャ TPicture.Assign(Source: TPersistent);Source = nil の場合に開始し、次に SetGraphic(nil)、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); jpg.LoadFromStream(PicStream); ); PicStream.無料;
私はあまり本を読まないので、読者の皆さん、最初はこのブログを書きたくなかったのですが、D10 ではこのブログを使用できないことがわかりました。 . それで私は自分を馬鹿にしました。