9

正しく理解できれば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

4 に答える 4

17

ヘッダーからのファイルコンテンツの取得については、このSOの回答を参照してください。

または、Gdi +ライブラリを使用してすべての種類の画像(bmp / gif / tiff / jpg / png)を1つのクラスで処理するTSynPictureクラスを使用することもできます。だから、あなたTPictureはどんな種類の写真でも、このユニークなクラスになることができます。JpegまたはPNGDelphiユニットよりも少ないコードオーバーヘッドで。

var Pic: TSynPicture;

Pic := TSynPicture.Create;
Pic.LoadFromStream(aStream); // will load bmp/gif/tiff/jpeg/png content
AImage.Picture.Graphic := Pic;
....
于 2011-06-06T12:12:24.167 に答える
7

ここから始めて、あなたはそれを簡単に行うことができます:http: //delphihaven.wordpress.com/2011/01/22/tip-detecting-graphic-formats/

于 2011-06-06T11:46:50.957 に答える
2

実際、それはTPicture.LoadFromFileファイルタイプを検出するものであり、ファイル拡張子を使用するだけです。したがって、ファイルタイプを検出するには、ストリームのヘッダーを読み取る必要があります。

一方、BLOBをデータベースに配置するときの形式がわかっている場合は、その情報をBLOBへの独自のプライベートヘッダーとしていつでも含めることができます。

于 2011-06-06T11:48:33.247 に答える
0

一見、任意の画像形式に対する魔法のTPictureの狡猾な処理は、実際には非常に単純です(大雑把なことは言うまでもありません)。ファイルからのロードは、ファイル拡張子に依存します。クリップボードからの読み込み-クリップボードフォーマットインジケーター上。見る?データで使用するTGraphicClassをTPictureに指示するフォーマットタグは常に存在し、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);
于 2011-06-06T13:19:50.400 に答える