SQLite3 - это легкая, но мощная встраиваемая база данных, которая идеально подходит для хранения данных в локальных приложениях. В этой статье мы рассмотрим, как использовать SQLite3 в средах Delphi и Free Pascal, включая хранение и извлечение изображений.
Варианты хранения изображений в приложении
Как правильно отметили участники обсуждения, существует несколько способов хранения изображений в приложении:
TImageList - подходит для небольших изображений (иконок)
SQLite с BLOB полями - для хранения любых бинарных данных
Собственный бинарный формат файла (как предложил paule32)
Ресурсы приложения (как напомнил Thaddy)
Рассмотрим наиболее универсальный вариант - SQLite3.
Настройка SQLite3 в Delphi
Для работы с SQLite3 в Delphi вам понадобится компонент, например, TSQLite3Connection из FireDAC или сторонние библиотеки.
Пример подключения к базе данных:
uses
FireDAC.Phys.SQLite, FireDAC.Comp.Client;
var
Conn: TFDConnection;
begin
Conn := TFDConnection.Create(nil);
try
Conn.DriverName := 'SQLite';
Conn.Params.Database := 'C:\data\images.db';
Conn.Connected := True;
// Далее работа с базой данных
finally
Conn.Free;
end;
end;
procedure LoadImageFromDB(AImageID: Integer; AImage: TImage);
var
Query: TFDQuery;
Stream: TMemoryStream;
begin
Query := TFDQuery.Create(nil);
Stream := TMemoryStream.Create;
try
Query.Connection := Conn;
Query.SQL.Text := 'SELECT ImageData FROM Images WHERE ID = :ID';
Query.ParamByName('ID').AsInteger := AImageID;
Query.Open;
if not Query.IsEmpty then
begin
TBlobField(Query.FieldByName('ImageData')).SaveToStream(Stream);
Stream.Position := 0;
AImage.Picture.Graphic.LoadFromStream(Stream);
end;
finally
Query.Free;
Stream.Free;
end;
end;
Альтернативные решения
1. Использование TImageList
Для небольших изображений действительно можно использовать TImageList:
var
ImageList: TImageList;
Image: TImage;
begin
ImageList := TImageList.Create(nil);
Image := TImage.Create(nil);
try
Image.Picture.LoadFromFile('image.png');
ImageList.Add(Image.Picture.Bitmap, nil);
// Далее можно использовать ImageList для отображения изображений
finally
Image.Free;
ImageList.Free;
end;
end;
2. Собственный бинарный формат файла
Как предложил paule32, можно создать собственный формат:
type
TImageHeader = record
Magic: Word;
Count: Integer;
Offsets: array of Integer;
end;
TImageData = record
Size: Integer;
Width: Integer;
Height: Integer;
Data: array of Byte;
end;
procedure SaveImagesToCustomFile(const AFileName: string; AImages: array of TImage);
var
Stream: TFileStream;
Header: TImageHeader;
Data: TImageData;
I: Integer;
MemStream: TMemoryStream;
begin
Stream := TFileStream.Create(AFileName, fmCreate);
try
Header.Magic := $4D47; // 'GM' - наш магический номер
Header.Count := Length(AImages);
SetLength(Header.Offsets, Header.Count);
// Записываем заголовок
Stream.Write(Header, SizeOf(Header) - SizeOf(Header.Offsets));
Stream.Write(Header.Offsets[0], Length(Header.Offsets) * SizeOf(Integer));
// Записываем данные изображений
for I := 0 to High(AImages) do
begin
Header.Offsets[I] := Stream.Position;
MemStream := TMemoryStream.Create;
try
AImages[I].Picture.Graphic.SaveToStream(MemStream);
Data.Size := MemStream.Size;
Data.Width := AImages[I].Picture.Width;
Data.Height := AImages[I].Picture.Height;
SetLength(Data.Data, Data.Size);
MemStream.Position := 0;
MemStream.Read(Data.Data[0], Data.Size);
Stream.Write(Data, SizeOf(Data) - SizeOf(Data.Data));
Stream.Write(Data.Data[0], Data.Size);
finally
MemStream.Free;
end;
end;
finally
Stream.Free;
end;
end;
Заключение
SQLite3 предоставляет отличный способ хранения изображений и других бинарных данных в вашем приложении. Это решение:
Позволяет хранить все данные в одном файле
Обеспечивает структурированное хранение с возможностью добавления метаданных
Поддерживает эффективный поиск и извлечение данных
Кросс-платформенное и легковесное
Для простых случаев можно использовать TImageList или собственный бинарный формат, но SQLite3 предлагает наиболее гибкое и масштабируемое решение.
Примеры кода в статье демонстрируют основные операции с SQLite3 в Delphi и Free Pascal. Вы можете адаптировать их под свои нужды и расширить функциональность по мере необходимости.
SQLite3 в Delphi и Free Pascal предоставляет удобные инструменты для работы с базами данных, включая хранение и извлечение изображений, с примерами кода для основных операций.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.