Si he entendido correctamente, TImage.LoadFromFile determina el tipo de imagen a partir de la extensión de archivo.

Hay alguna forma de detectar el tipo de imagen automáticamente a partir de una TBlobStream con una imagen raw en ella?

Mi código actual:

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

OriginalEl autor Jens Mühlenhoff | 2011-06-06

4 Comentarios

  1. 16

    Ver este PARA responder para el archivo de recuperación de contenido de encabezado.

    O puede utilizar nuestro TSynPicture clase, que se encargará de todo tipo de imágenes (bmp/gif/tiff/jpeg/png) utilizando Gdi+ biblioteca, en una sola clase. Por lo que su TPicture puede ser esta clase única, para cualquier tipo de imagen. Con menos código sobrecarga que el Jpeg o PNG Delphi unidades.

    var Pic: TSynPicture;
    
    Pic := TSynPicture.Create;
    Pic.LoadFromStream(aStream); // will load bmp/gif/tiff/jpeg/png content
    AImage.Picture.Graphic := Pic;
    ....
    Si desea TSynPicture para cargar GIF/PNG/JPG/TIFF imágenes, comentar una definición de NOTSYNPICTUREREGISTER en el código fuente de SynGdiPlus.pas.

    OriginalEl autor Arnaud Bouchez

  2. 2

    De hecho es TPicture.LoadFromFile que detecta el tipo de archivo, y que sólo utiliza la extensión de archivo. Así que tendrás que leer el encabezado de la secuencia a detectar el tipo de archivo.

    Por otro lado, si usted sabe lo que el formato es cuando se pone el BLOB en la base de datos siempre se puede incluir información como su propio encabezado de la nota.

    «leer el encabezado de la corriente» y hay Chris Rolliston blog resolver el problema 🙂

    OriginalEl autor David Heffernan

  3. 0

    Aparentemente magia TPicture astuto manejo arbitrario de los formatos de imagen es realmente muy simple (por no decir de crudo). La carga de archivos se basa en la extensión de archivo. Carga desde el portapapeles – en formato de portapapeles indicador. Ver? Siempre hay un formato de etiqueta que indica TPicture que TGraphicClass para el uso de los datos, y TGraphic base de la clase en sí no proporciona ningún mecanismo para identificar a los «propios» flujos de datos de besided de prueba-y-error de enfoque. Uno puede ser curioso cómo TPicture carga de DFM corriente, pero no es una excepción, aquí es un extracto relevante de la aplicación (derechos de autor de código proporcionado a título meramente ilustrativo):

    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);
    … así que se lee la correspondiente TPicture nombre de clase de la DFM corriente, en lugar de utilizar la Imagen de encabezado binario. Así que no se pueden mezclar, por ejemplo Jpeg cargar las librerías, o tendrás a nombre de todos ejecución TJpegImage (que es lo que yo he hecho para SynGdiPlus para que sea compatible con el estándar Jpeg unidad en el código de usuario y DFM carga).

    OriginalEl autor Premature Optimization

Dejar respuesta

Please enter your comment!
Please enter your name here