Из-за проекта мне приходилось сохранять картинки в базу данных и читать их из базы данных, когда это необходимо. Сначала я думал, что это очень просто, а не просто Stream. На самом деле это тоже очень просто. это, кодов много, но, это все подводные камни!
Взгляните на исходный код TImage. В разделе Picture.Graphic есть loadfromStream и SavetoStream. Если вы правильно догадались, вы можете просто использовать эти две функции. Итак, я сделал демо-тест.
В демо-версии есть два изображения TImage. TImage1 содержит изображение, а затем используется код для сохранения изображения TImage1 в Stream.TImage2, а затем извлечения изображения из этого потока. Оно естественным образом встанет на свое место.
Это мой код.
PicStream:=TMemoryStream.Create; Self.Image1.Picture.SaveToStream(PicStream.Position:=0; Self.Image2.Picture.Graphic.loadFromStream(PicStream.Free);
Но на самом деле он допустил ошибку. Поэтому я искал в Baidu снова и снова. Результат был один и тот же (не понимаю, почему в Интернете так много проблемных кодов. Это из-за разных версий?).
Поэтому я отследил его TPicture.Assign, потому что если я напрямую использую TPicture.Assign для копирования Timage1, ошибки не будет.
процедура TPicture.Assign(Source: TPersistent);begin, если Source = nil, то SetGraphic(nil), иначе, если Source равен TPicture, то SetGraphic(TPicture(Source.Graphic) else, если Source равен TGraphic, то SetGraphic(TGraphic(Source)) else наследуется Назначить(Источник);конец;
Оказывается, когда он вызывает Assign, он вызывает SetGraphic для создания объекта TGraphic.
Поэтому, если я все же хочу использовать функцию Graphic.loadFromStream, мне придется вручную создать объект TGraphic, иначе что-то обязательно пойдет не так. Более того, TGraphic придется создавать путем вызова разных ClassTypes в соответствии с разными форматами изображений. это еще немного хлопотно. И я использовал объект TJPEGImage, и вызов его LoadFromStream может напрямую читать поток, поэтому какое-то время я ленился.
Jpg:=TJPEGImage.Create; PicStream:=TMemoryStream.Create; Self.Image1.Picture.Graphic.SaveToStream(PicStream.Position:=0; jpg.LoadFromStream(PicStream); Self.Image2.Picture.Assign(JPg); );
Я не читаю много книг. Этот блог странный. Читатели, я просто справлюсь с этим. Сначала я не хотел писать этот блог, но увидел, что код сайта нельзя использовать под D10. Так что я выставил себя дураком.