Как загрузить произвольное изображение из потока 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);