Поток данных JPEG в TImage

У меня есть несколько файлов изображений, хранящихся в одном файле (какой-то архив). Этот файл выглядит так:

Ну, это разделено на два сегмента - заголовок и сегмент данных. Заголовок (зеленый) содержит различную информацию, такую ​​как название альбома, местоположение, дата / время, описание, количество фотографий в альбоме и т. Д. Сегмент данных (синий и оранжевый) имеет простую структуру и содержит N x JPEG-фотографию. Я могу извлечь этот сегмент "imagedata" в новый объект TMemoryStream, и теперь я хочу показать его с помощью TImage.

Я могу использовать метод SaveAsFile в TMemoryStream, установить временное имя файла, загрузить этот файл из TImage, а затем удалить временный файл. Это работает, но мне интересно, есть ли способ отправить этот поток в TImage без использования temp. файлы.

Конечно, я могу написать код для извлечения всех этих файлов на жесткий диск, но проблема в том, что у меня есть много архивов, подобных этому, и я просто хочу написать приложение для чтения этих "альбомов" вместо того, чтобы иметь более 20000 фотографий на моем жестком диске.,

Короче говоря, все, что я хочу, - это заставить следующую процедуру работать (без временных файлов)

procedure ShowImageFromStream(data: TStream; img: TImage);
begin
...
end;

Заранее спасибо.

1 ответ

Решение

Я не уверен, что это то, что вы ищете, но этот код должен загрузить файл JPEG из потока в данный компонент TImage:

uses
  JPEG;

procedure ShowImageFromStream(AImage: TImage; AData: TStream);
var
  JPEGImage: TJPEGImage;
begin
  AData.Position := 0;
  JPEGImage := TJPEGImage.Create;
  try
    JPEGImage.LoadFromStream(AData);
    AImage.Picture.Assign(JPEGImage);
  finally
    JPEGImage.Free;
  end;
end;
Другие вопросы по тегам