Aufgrund eines Projekts musste ich die Bilder in der Datenbank speichern und bei Bedarf aus der Datenbank lesen. Zuerst dachte ich, es sei sehr einfach, nicht nur ein Stream. Tatsächlich ist es auch sehr einfach Es gibt viele Codes, aber alle sind Fallstricke!
Schauen Sie sich die Quelle von TImage an. Es gibt LoadfromStream und SavetoStream. Wenn Sie richtig geraten haben, können Sie diese beiden Funktionen einfach verwenden
Es gibt zwei TImage in der Demo. TImage1 fügt ein Bild ein und verwendet dann den Code, um das Bild von TImage1 in Stream.TImage2 zu speichern, und nimmt dann das Bild aus diesem Stream auf.
Das ist mein Code.
PicStream:=TMemoryStream.Create; Self.Image1.Picture.SaveToStream(PicStream.Position:=0; Self.Image2.Picture.loadFromStream(PicStream.Free);
Aber tatsächlich hat er einen Fehler gemacht, also habe ich Baidu immer wieder durchsucht. Das Ergebnis war das gleiche (ich verstehe nicht, warum es im Internet so viele problematische Codes gibt. Liegt es an den unterschiedlichen Versionen?)
Also habe ich sein TPicture.Assign verfolgt, denn wenn ich TPicture.Assign direkt zum Kopieren von Timage1 verwende, gibt es keinen Fehler.
procedure TPicture.Assign(Source: TPersistent);begin if Source = nil then SetGraphic(nil) else if Source is TPicture then SetGraphic(TPicture(Source).Graphic) else if Source is TGraphic then SetGraphic(TGraphic(Source)) else inherited Assign(Source);end;
Es stellt sich heraus, dass er beim Aufrufen von Assign SetGraphic aufruft, um ein TGraphic-Objekt zu erstellen.
Wenn ich also weiterhin die Funktion Graphic.loadFromStream verwenden möchte, muss ich das TGraphic-Objekt manuell erstellen. Außerdem muss das TGraphic durch Aufrufen verschiedener ClassTypes entsprechend unterschiedlicher Bildformate erstellt werden ist etwas mühsamer. Und ich habe ein TJPEGImage-Objekt verwendet und der Aufruf von LoadFromStream kann den Stream direkt lesen, also war ich eine Weile faul.
Jpg:=TJPEGImage.Create; PicStream:=TMemoryStream.Create; Self.Image1.Picture.SaveToStream(PicStream); PicStream.Position:=0; jpg.LoadFromStream(PicStream); ); PicStream.Free;
Ich lese nicht viele Bücher, ich wollte mich zunächst nicht damit begnügen, aber ich habe gesehen, dass der Code der Website nicht unter D10 verwendet werden kann . Also habe ich mich lächerlich gemacht.