По сути, это та же проблема, что и в исходном вопросе.
Данные файла INI - это представление двоичного изображения в формате Base64, то есть строка . Итак, вам нужно прочитать эту строку Base64 и преобразовать ее в двоичный blob, используя Base64Enc
.
Но ваш код использует метод ReadBinaryStream
, который обрабатывает текст не как строку Base64, а как шестнадцатеричный байт последовательность и возвращает его как двоичный blob, а затем вы передаете его Base64Enc
.
Сделайте это вместо:
var
ImgData: TBytes;
begin
MyIni := TMemIniFile.Create('D:\img.ini');
try
Base64Enc := TBase64Encoding.Create(Integer.MaxValue, '');
try
LInput := TMemoryStream.Create;
try
ImgData := Base64Enc.DecodeStringToBytes(MyIni.ReadString('Custom', 'IMG', ''));
LInput.WriteData(ImgData, Length(ImgData));
LInput.Position := 0;
ThisPicture := TPicture.Create;
try
ThisPicture.LoadFromStream(LInput);
// Use ThisPicture
finally
ThisPicture.Free;
end;
finally
LInput.Free;
end;
finally
Base64Enc.Free;
end;
finally
MyIni.Free;
end;
Один из способов, которым вы могли бы это понять, - это подумать так :
Как закодировать ? Ну, я делаю
Base64Enc.EncodeBytesToString
MyIni.WriteString
Итак, чтобы декодировать , я делаю обратные процедуры в обратном порядке:
MyIni.ReadString
Base64Enc.DecodeStringToBytes
Избавление от ненужной копии
В комментариях , Remy Lebeau правильно указывает, что приведенный выше код выполняет ненужную копию данных двоичного изображения в памяти. Хотя на практике это маловероятно (или даже измеримо!), Учитывая, что мы читаем изображение из поля в кодировке Base64 в файле INI, это, тем не менее, расточительно и некрасиво.
Путем замены TMemoryStream
с TBytesStream
(потомок TMemoryStream
), мы можем декодировать данные Base64 прямо в поток:
var
ImgStream: TBytesStream;
begin
MyIni := TMemIniFile.Create('D:\img.ini');
try
Base64Enc := TBase64Encoding.Create(Integer.MaxValue, '');
try
ImgStream := TBytesStream.Create(Base64Enc.DecodeStringToBytes(MyIni.ReadString('Custom', 'IMG', '')));
try
ThisPicture := TPicture.Create;
try
ThisPicture.LoadFromStream(ImgStream);
// Use ThisPicture
finally
ThisPicture.Free;
end;
finally
ImgStream.Free;
end;
finally
Base64Enc.Free;
end;
finally
MyIni.Free;
end;