Delphi. Как добавить картинки в БД и прочитать их?

О том как добавлять текстовую информацию, я писал в соответствующем посте. Но как добавить картинку? И какие в связи с этим могут возникнуть трудности? Частично добавление картинок было рассмотрено в посте про DataControls в разделе DBImage.


 

ДЛЯ БОЛЬШИНСТВА ФОРМАТОВ

Ссылку на класс TWICImage мне отправил пользователь под ником RIUS, эта информация добавлена чуть позже, чем я написал основной пост, но мне она показалась интересной, потому что позволяет работать с большинством форматов (единственное, пока не разобрался с PNG, с прозрачными слоями)…

Итак, знакомьтесь, класс TWICImage – позволяет обрабатывать BMP, JPEG, TIFF, PNG и др. популярные форматы…

Ещё полезная ссылка по данному классу.

Как добавить изображение в БД, используя класс TWICImage  ?

 

Ниже Вы найдете информацию о “стандартных” способах добавления картинок в БД и чтения из БД. TWICImage я поставил наверх, потому что он, на мой взгляд, более универсальный.

ДОБАВЛЕНИЕ / ЧТЕНИЕ ЧЕРЕЗ TMemoryStream (Подходит для BMP,JPEG и др. НО НЕ PNG)

1

C BMP, JPEG такой трюк хорошо пройдет, только для JPEG надо подключить в uses модуль JPEG; C PNG трабл в том, что, при наличии прозрачного слоя – возникает черный фон. Как это победить, пока не придумал ((

Как сохранить изображение в БД?


Как прочитать изображение из БД?

Самое простое – в компонент DBImage, предварительно выставив свойства (например в FormCreate…)

2 способ – загрузка изображения в компонент image из BLOB поля БД…


ДОБАВЛЕНИЕ / ЧТЕНИЕ ЧЕРЕЗ ASSIGN (Подходит для BMP,JPEG и др. НО НЕ PNG)

2

Как записать изображение в БД через Assign ?

(на примере записи в базу jpeg)

Как прочитать изображение в БД через Assign ?


ТРАБЛ С PNG

Если применить эти методы к файлам формата PNG, то при наличии прозрачного слоя у меня возникал черный фон.

11

 

Как это победить – на настоящий момент – не знаю. Одинаковая картина – если отображать на DBImage и на Image. Причём, если PNG отображать на форме простой загрузкой файла (не через сохранение в БД и последующего чтения), то PNG отображается при этом нормально…

12

 

Возможно поможет функция Scanline, но за 1,5 дня безуспешных попыток – готового решения не получилось. Написал о проблеме на форуме, но пока тишина…

Думаю попробовать использовать 4 байт, который предназначен для Альфа канала. Довольно хорошая статья по сканлайн находится здесь.

И ещё одна статья по skyline на английском – достаточно подробная. В общем, надо разбираться в вопросе…

Но надо экспериментировать дальше…

Если у Вас есть готовое решение, пожалуйста, напишите мне на почту panteleevstas@gmail.com

Решение найдено!

Дело в том, что компонент DBImage – не поддерживает прозрачность. А Image – поддерживает.

4

 

Итак, чтобы отображать рисунки с прозрачностью, нужно загружать их в Image следующим образом…