Как загрузить произвольное изображение из потока BLOB в TImage?

Если я правильно понимаю, TImage.LoadFromFile определяет тип изображения из расширения файла.

есть ли способ автоматически определить тип изображения из TBlobStream с необработанным изображением в нем?

мой текущий код:

procedure LoadImageFromStream(AImage: TImage; ADataSet: TDataSet);
var
  Stream: TStream;
begin
  Stream := ADataSet.CreateBlobStream(Field, bmRead);
  try
    AImage.Picture.Graphic.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end

4 ответов


посмотреть этот так что ответ для извлечения содержимого файла из заголовка.

или вы можете использовать наш TSynPicture класс, который будет обрабатывать все виды изображений (bmp/gif/tiff/jpg/png) с помощью библиотеки Gdi+ в одном классе. Так ваш TPicture может быть этот уникальный класс, для любого вида рисунка. С меньшими накладными расходами кода, чем блоки Jpeg или PNG Delphi.

var Pic: TSynPicture;

Pic := TSynPicture.Create;
Pic.LoadFromStream(aStream); // will load bmp/gif/tiff/jpeg/png content
AImage.Picture.Graphic := Pic;
....

начиная отсюда, вы можете легко сделать это: http://delphihaven.wordpress.com/2011/01/22/tip-detecting-graphic-formats/


на самом деле это TPicture.LoadFromFile, который определяет тип файла, и он просто использует расширение файла. Поэтому вам нужно будет прочитать заголовок потока, чтобы определить тип файла.

С другой стороны, если вы знаете, что такое формат, когда вы помещаете BLOB в базу данных, вы всегда можете включить эту информацию в свой собственный заголовок BLOB.


казалось бы магия TPicture хитрая обработка для произвольных форматов изображений на самом деле очень проста (не говоря уже о сырой). Загрузка из файлов зависит от расширения файла. Загрузка из буфера обмена-индикатор формата буфера обмена. Видишь? Всегда есть тег формата, который инструктирует TPicture, который TGraphicClass использовать для данных, а сам базовый класс TGraphic не предоставляет механизма для идентификации "собственных" потоков данных, связанных с методом проб и ошибок. Может быть любопытно, как tpicture нагрузки сам из DFM stream, но это не исключение, вот соответствующая выдержка из реализации (защищенный авторским правом код предоставлен только для иллюстративной цели):

procedure TPicture.ReadData(Stream: TStream);
var
  {...}
  GraphicClass: TGraphicClass;
  LClassName: string;
  LBytes: TBytes;
  LNameLen: Byte;
begin
  Stream.Read(LNameLen, 1);
  SetLength(LBytes, LNameLen);
  Stream.Read(LBytes{$IFNDEF CLR}[0]{$ENDIF}, LNameLen);
  LClassName := TEncoding.UTF8.GetString(LBytes);

  GraphicClass := FileFormats.FindClassName(LClassName);