Преобразование изображения из TImage в Blob вызывает повреждение изображения

#mysql #image #delphi #blob #vcl

#mysql #изображение #delphi #blob #vcl

Вопрос:

В настоящее время у меня возникла проблема, когда я беру изображение, отображаемое в TImage компоненте, конвертирую его и сохраняю в поле BLOB. Теперь я знаю, что это не оптимизированное решение, но для моих целей это нормально. Не собираюсь хранить огромное количество изображений.

Изображение сохраняется в поле Blob-объекта базы данных MySQL. Проблема возникает, когда я хочу снова отобразить изображение в TImage компоненте, оно показывает только половину изображения, нижняя часть каким-то образом повреждается.

Вот код для вставки в БД:

 image1.Picture.LoadFromFile(fileName);
if image1.Picture.Graphic <> nil then
begin
  Field := TBlobField(database.qDBImages.FieldByName('image_one'));
  stream_one := database.qDBImages.CreateBlobStream(Field, bmWrite);
  try
    image1.Picture.Graphic.SaveToStream(stream_one);
    ShowMessage('we are saving to stream');
  finally
    database.qDBImages.Post;
    stream.Free;
  end;
  

Теперь проблема возникает, когда мне нужно отобразить значение обратно в a TImage , затем оно повреждается. Вот код для отображения изображения:

 var
  Field : TBlobField;
  Stream : TStream;
  Jpg : TJPEGImage;
begin
  database.qDBImages.Active := true;

  if database.qDBImages.Active then
  begin
    Field := TBlobField(database.qDBImages.FieldByName('image_one'));
    Stream := database.qDBImages.CreateBlobStream(Field, bmRead);
    Jpg := TJPEGImage.Create;
    try
      Jpg.LoadFromStream(Stream);
      Image1.Picture.Graphic := Jpg;
    finally
      Jpg.Free;
      Stream.Free;
    end;
  end;
  

Есть ли какой-либо другой способ преобразовать изображение в поле blob и не повредить при извлечении?

Я где-то читал, что это может быть связано с длиной большого двоичного объекта, но я не уверен.

Есть ли какой-либо способ улучшить это?

Комментарии:

1. Я не вижу ничего явно неправильного. Пожалуйста, покажите, как поле определено в базе данных. Вы проверяли размер большого двоичного объекта с помощью приложения управления базами данных по сравнению с размером потока больших двоичных объектов в Delphi? Эта проверка позволит понять, заключается ли проблема в записи JPG в базу данных или в чтении его обратно.

2. @fpiette ну, в приложении для управления базами данных (я использую myphpadmin) просто говорится, что размер большого двоичного объекта не отображается или какие-либо другие атрибуты, он просто определяется как большой двоичный объект без размера. Когда я запускаю lblSize.Caption := IntToStr(database.tbBayMonitorimage.Size); Я просто получаю 0 для поля. Так что не знаю, как увидеть фактический размер. Я указал таблицу на первую запись перед запуском функции size.

3. Вы загружаете фактические файлы JPG в TImage ? TPicture поддерживает несколько форматов изображений, но ваш код повторной загрузки разрешает только JPG. Вы должны записать тип изображения в большой двоичный объект перед фактическими данными изображения. Затем вы можете прочитать тип изображения, создать правильный TGraphic класс, а затем загрузить в него данные.

4. Тип MySQL BLOB может хранить только 64 КБ. Убедитесь, что вы используете как минимум MEDIUMBLOB (16 МБ).

5. Чтобы получить размер большого двоичного объекта, вы можете использовать функцию MySQL OCTET_LENGTH() .

Ответ №1:

Таким образом, решение было взято из предложения Оливера сверху. Я только что изменил поле blob на поле mediumblob, увеличив максимальный размер с 64 КБ до 16 МБ. Так что все благодаря Оливье