Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Сохранение сжатого TPicture в файл INI: решение проблемы записи потока данных"

Delphi , Файловая система , INI файлы

Вопрос пользователя заключается в том, как сохранить сжатый поток данных TPicture в файл INI в среде разработки Delphi 10.4, используя пример из документации по сжатию ZLibCompressDecompress. В примере кода используется TZCompressionStream для сжатия потока, но при записи в файл INI результатом является пустой раздел.

Оригинальный код:

procedure TForm1.SavePictureToIniFile(const APicture: TPicture);
var
  LInput, LOutput: TMemoryStream;
  MyIni: System.IniFiles.TMemIniFile;
  ThisFile: string;
  LZip: TZCompressionStream;
begin
  if FileSaveDialog1.Execute then
    ThisFile := FileSaveDialog1.FileName
  else Exit;

  LInput := TMemoryStream.Create;
  LOutput := TMemoryStream.Create;
  LZip := TZCompressionStream.Create(clDefault, LOutput);
  try
    APicture.SaveToStream(LInput);
    LInput.Position := 0;
    LZip.CopyFrom(LInput, LInput.Size);

    MyIni := TMemIniFile.Create(ThisFile);
    try
      MyIni.WriteBinaryStream('Custom', 'IMG', LOutput);
      MyIni.UpdateFile;
    finally
      MyIni.Free;
    end;
  finally
    LInput.Free;
    LOutput.Free;
    LZip.Free;
  end;
end;

Проблема:

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

Подтвержденный ответ на проблему:

Перед записью сжатого потока в файл INI необходимо установить указатель Position объекта LOutput на начало, после выполнения операции копирования из входного потока. Это позволит корректно прочитать данные для записи:

LZip.CopyFrom(LInput, LInput.Size);
LOutput.Position := 0; // Установка указателя на начало сжатого потока
MyIni.WriteBinaryStream('Custom', 'IMG', LOutput);

Альтернативное решение:

Также было предложено использовать кодирование в Base64 для уменьшения размера INI файла, что может быть более предпочтительным вариантом по сравнению с прямым сохранением бинарных данных. Это позволяет избежать проблем с хранением непечатаемых символов и обеспечивает лучшую совместимость с форматом INI.

Пример кода с использованием Base64:

uses
  System.SysUtils,
  System.Classes;

// Функция для кодирования данных в Base64
function EncodeToBase64(const Data: TStream): string;
var
  Encoder: TEncoder;
begin
  Result := '';
  if Data.Size > 0 then
    begin
      Encoder := TEncoding.Base64.Encoding;
      SetLength(Result, Encoder.GetByteCountSChar(Data.Size div 2) + 1);
      Encoder.EncodeChar(Result[1], Data, False);
    end;
end;

procedure TForm1.SavePictureToIniFile(const APicture: TPicture);
var
  LInput, LOutput: TMemoryStream;
  MyIni: System.IniFiles.TMemIniFile;
  ThisFile: string;
  LZip: TZCompressionStream;
begin
  // ...
  LZip := TZCompressionStream.Create(clDefault, LOutput);
  try
    APicture.SaveToStream(LInput);
    LInput.Position := 0;
    LZip.CopyFrom(LInput, LInput.Size);
    LOutput.Position := 0; // Установка указателя на начало сжатого потока

    // Преобразование в Base64
    var Base64Data: string = EncodeToBase64(LOutput);

    MyIni := TMemIniFile.Create(ThisFile);
    try
      MyIni.WriteString('Custom', 'IMG', Base64Data);
      MyIni.UpdateFile;
    finally
      MyIni.Free;
    end;
  // ...
end;

Заключение:

Вышеуказанные решения позволяют сохранить сжатый TPicture в файл INI. Важно помнить, что использование Base64 может быть предпочтительнее для сохранения совместимости и упрощения обработки данных, особенно если размер файла не является критичным фактором. Если же необходимо минимизировать размер файла, следует тщательно взвесить преимущества и недостатки различных подходов к сжатию и кодированию данных.


Статья подготовлена для программистов, использующих Delphi и Pascal, в качестве практического руководства по решению типичных задач сохранения данных в формате INI.

Создано по материалам из источника по ссылке.

Вопрос пользователя заключается в том, как правильно сохранить сжатый поток данных TPicture в файл INI в среде разработки Delphi 10.4, используя сжатие и примеры из документации по работе с ZLibCompressDecompress, при этом важно учесть, что напрямую сохр


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: INI файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 11:43:43/0.0035350322723389/0