Ошибка нарушения доступа в Delphi при сохранении / загрузке изображения в / из потока

Я разрабатываю приложение в Delphi. Я пытаюсь извлечь изображение, которое сохраняется в базе данных, сохранить его в TMemoryStream и загрузить то же изображение в TImage элемент управления размещен в другой форме, которая будет динамически заполняться. Я получаю ошибку нарушения доступа при попытке загрузить изображение из потока в элемент управления изображением, размещенный в форме.

Описание ошибки выглядит следующим образом

Нарушение прав доступа по адресу 00B548C в модуле abc.exe. Чтение адреса 0000000

Мой фрагмент кода выглядит следующим образом

UniConnection1.Connected := true;  
UniQuery2.SQL.Text := 'Select image from userplays where id = :id';
UniQuery2.Params.ParamByName('id').Value := idpub1;
UniQuery2.Open;
if UniQuery2.FieldByName('image').AsString <> '' then

begin       
   try
   Stream121 := TMemoryStream.Create;
   TBlobField(UniQuery2.FieldByName('image')).SaveToStream(Stream121);
   Stream121.Position := 0;
      if Assigned(Stream121) then
      begin
         Image1.Picture.Graphic.LoadFromStream(Stream121);
         Image1.Update;
      end;

    finally
      Stream121.Free;
    end;
end;

2 ответа

Решение

TPicture не может определить тип графики в потоке, поэтому вы должны сообщить об этом раньше. Если у вас есть только изображения в формате JPEG, вы можете просто указать это жестко. В противном случае вы также должны сохранить формат изображения в базе данных.

var
  graphic: TGraphic;  

Stream121.Position := 0;
if Stream121.size > 0 then begin
  graphic := TJPEGImage.Create;
  try
    graphic.LoadFromStream(Stream121);
    Image1.Picture.Graphic := graphic;
  finally
    graphic.Free;
  end;
end;

Вы имеете в виду Graphic.LoadfromStream. Но Графика не может (вероятно, не будет) существовать. Вы можете сохранить файл и использовать вместо него Picture.LoadFromFile (так как это создаст соответствующий потомок TGraphic) или сначала создать Picture.Graphic в качестве соответствующего типа (например, TBitmap).

Picture.Graphic := TBitMap.Create;

В нынешнем виде изображение не имеет представления о том, в каком графическом формате находятся ваши данные. Вам нужно будет как-то сообщить это.

Другие вопросы по тегам