Как загрузить произвольное изображение из потока BLOB в TImage? - PullRequest
8 голосов
/ 06 июня 2011

Если я правильно понимаю, 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 ]

16 голосов
/ 06 июня 2011

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

Или вы можете использовать наш 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;
....
7 голосов
/ 06 июня 2011

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

2 голосов
/ 06 июня 2011

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

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

0 голосов
/ 06 июня 2011

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

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);
...