Как сохранить изображение (Jpeg) в MySql и получить его позже? - PullRequest
1 голос
/ 17 ноября 2010

Ищем пример кода, желательно с использованием TADOConnection.

Я хочу сохранить TPicture TImage в базу данных MySql (предпочтительно ODBC, а не просто MySql), а позже я хочу создать TImage иполучить изображение в свойстве TPicture.

Любые фрагменты кода или ссылки на него?

Ответы [ 3 ]

11 голосов
/ 17 ноября 2010

Вы можете использовать BLOB-поля.Предположим, у вас есть экземпляр TAdoDataset, и вы хотите отредактировать поле изображения.Вы можете использовать код, подобный следующему:

  AStream := TMemoryStream.Create;
  try
    Image1.Picture.Graphic.SaveToStream(AStream);
    AStream.Position := 0;
    if ADODataSet1.Active then
    begin
      ADODataSet1.Edit;
      TBlobField(ADODataSet1.FieldByName('MyField')).LoadFromStream(AStream);
      ADODataSet1.Post;
    end;
  finally
    AStream.Free;
  end;

Вы также можете использовать элемент управления DBImage, который учитывает данные, и загрузка любого изображения в него означает загрузку этого изображения в поле.

Чтобы извлечь данные поля и загрузить их в экземпляр TImage, у вас может быть такой код:

var
  AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    if ADODataSet1.Active then
    begin
      TBlobField(ADODataSet1.FieldByName('MyField')).SaveToStream(AStream);
      AStream.Position := 0;
      Image1.Picture.Graphic.LoadFromStream(AStream);
    end;
  finally
    AStream.Free;
  end;
end;

Предупреждение : в этом коде я предположил, что Image1.Picture.Graphic isне ноль.Если ваш элемент управления изображением пуст, тогда свойство Picture.Graphic имеет значение Nil, и приведенный выше код даст вам нарушение прав доступа.У вас есть два способа избежать этого:

  1. Вместо сохранения изображения в потоке памяти сохраните его в локальном временном файле, а затем загрузите изображение с помощью Image1.Picture.LoadFromFile.LoadFromFile проверяет расширение файла и в соответствии с расширением файла создает надлежащий объект из одного из классов-потомков TGraphics.Например, если файл JPEG, он создает экземпляр класса TJPEGImage и загружает в него данные.
  2. Вы сами создаете правильный объект и назначаете его для Image1.Picture.Graphic.Например, если ваше изображение в формате JPEG, создайте экземпляр TJPEGImage, загрузите в него поток, а затем назначьте его для Image1.Picture.Graphic.

Если вы вставляете или обновляете запись в БД, используяКоманды SQL (INSERT / UPDATE), вы должны использовать параметры SQL в вашей команде SQL, затем вы можете загрузить поток в параметр, представляющий поле вашего изображения:

///Sample SQL Command:

INSERT INTO My_Table_Name
(MyField1, MyField2) 
VALUES (:prmMyField1, :prmMyField2)


/// Sending INSERT command to DB server

var
  AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    Image1.Picture.Graphic.SaveToStream(AStream);
    AStream.Position := 0;
     // Save some random data into the first param
    ADOCommand1.Parameters.ParamByName('prmMyField1').Value := 1;
    // Save image stream into the second param
    ADOCommand1.Parameters.ParamByName('prmMyField2').LoadFromStream(AStream);
    ADOCommand1.Execute;
  finally
    AStream.Free;
  end;
end;
2 голосов
/ 17 ноября 2010

Вы храните само изображение в MySQL?Почему ты бы так поступил?В этом отношении сделано несколько контрольных показателей, которые позволяют сделать вывод, что эта практика не масштабируется.

Лучше всего сохранить все ваши изображения на диске и иметь таблицу, которая содержит ссылки на все изображения.

Простой запрос в Google - «mysql image store» или «mysql image store benchmarks» предоставят вам соответствующие ссылки.

1 голос
/ 17 ноября 2010

может быть, это может вам помочь:

http://www.scalabium.com/faq/dct0065.htm - сохранить компонент в поток

и после этого сохранить поток в MySql

http://www.devarticles.com/c/a/Delphi-Kylix/Saving-Images-and-Binary-Files-to-a-Database-with-Delphi-2/

и http://en.allexperts.com/q/Delphi-1595/2008/7/Save-big-file-Mysql.htm

надеюсь, что это то, что вы хотите, и я хорошо понимаю, что вы спрашиваете.

С наилучшими пожеланиями,

...