#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 МБ. Так что все благодаря Оливье