2011-10-21 22 views
3

私は現在Delphi XE2体験版で作業しています。 TImageコントロールにTIFFイメージをロードして表示する際に、サードパーティコンポーネント/ライブラリを使用しないでください。TImageコントロールでtiff画像をロードして表示する方法は?

私は以下のコードを試しましたが、私のためにウォーキングしていません。

Procedure TForm1.Button1Click(Sender: TObject); 
Var 
    OleGraphic    : TOleGraphic; 
    fs      : TFileStream; 
    Source     : TImage; 
    BMP      : TBitmap; 
Begin 
    Try 
      OleGraphic := TOleGraphic.Create; 

      fs := TFileStream.Create('c:\testtiff.dat', fmOpenRead Or fmSharedenyNone); 
      OleGraphic.LoadFromStream(fs); 

      Source := Timage.Create(Nil); 
      Source.Picture.Assign(OleGraphic); 

      BMP := TBitmap.Create; 
      bmp.Width := Source.Picture.Width; 
      bmp.Height := source.Picture.Height; 
      bmp.Canvas.Draw(0, 0, source.Picture.Graphic); 

      image1.Picture.Bitmap := bmp; 
    Finally 
      fs.Free; 
      OleGraphic.Free; 
      Source.Free; 
      bmp.Free; 
    End; 
End; 

アドバイスをしてください。

+2

ファイル拡張子が標準のtiff拡張子だった場合、これは1ライナーのimage1.Picture.LoadFromFile(MyTiffFile)になります。そうでなければ、このSOの質問はあなたを助けるかもしれません[どのようにロードする任意のイメージからブロブストリームの時間に](http://stackoverflow.com/questions/6251504/how-任意の画像をブロブからストリームに書き出すこと) –

+0

このコードがhttp://www.swissdelphicenter.ch/en/showcode.phpのサンプルから来たのかと思います?id = 2012(2004年の日付)。私が取り組んでいるコードベースでは、まれに探索された部分で同じコードを効果的に見つけました。 –

答えて

2

としては、ファイルの拡張子は、標準のTIFF拡張である場合は、ファイルを開くためのコードは簡単です、私のコメントで述べている:

image1.Picture.LoadFromFile(MyTiffFile); 

ない場合は、dwrbudrから答えに従ってください。アップXP SP3との作品もTWICImage

procedure LoadBitmapFromFile(aImage : TImage; tiffFilename : String); 
var 
    tiffIm : TWICImage; 
    ext : String; 
begin 
    ext := SysUtils.ExtractFileExt(tiffFilename); 
    if (ext = '.tif') or (ext = '.tiff') 
    then aImage.Picture.LoadFromFile(tiffFilename) 
    else begin 
     tiffIm:= TWICImage.Create; 
     try 
     tiffIm.LoadFromFile(tiffFilename); 
     aImage.Picture.Bitmap.Assign(tiffIm); 
     finally 
     tiffIm.Free; 
     end; 
    end; 
end; 

参照してください:ここで

は一例です。

6
 tiff := TWICImage.Create; 
    tiff.LoadFromFile(Filename); 
    ABitmap.Assign(tiff); 
4

あなたはGDI+を使用することができます。

uses ..., ActiveX, GDIPAPI, GDIPOBJ, GDIPUTIL; 

function LoadImageFromFile(const FileName: string; Bmp: TBitmap): Boolean; 
var 
    GPImage: TGPImage; 
    encoderClsid: TGUID; 
    MemStream: TMemoryStream; 
begin 
    Result := False; 
    GPImage := TGPImage.Create(FileName); 
    try 
    if GPImage.GetLastStatus = Ok then 
    begin 
     MemStream := TMemoryStream.Create; 
     try 
     GetEncoderClsid('image/bmp', encoderClsid); 
     if GPImage.Save(TStreamAdapter.Create(MemStream), encoderClsid) = Ok then 
     begin 
      MemStream.Position := 0; 
      Bmp.LoadFromStream(MemStream); 
      Result := True; 
     end; 
     finally 
     MemStream.Free; 
     end; 
    end; 
    finally 
    GPImage.Free; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    LoadImageFromFile('D:\ML_10222.tif', Image1.Picture.Bitmap); 
end; 

私もSynopse TSynPicture(GDI +のラッパー)を言及したいと思います:https://stackoverflow.com/a/6251810/937125


EDIT: GDI + TGPImageは、複数のTIFFフレームをサポートしています/ページ:

フレームを取得するに

は使用を数える:TSynPictureも複数のフレームをサポートしていることを

GPImage.SelectActiveFrame(GDIPAPI.FrameDimensionPage, Index); 

注:

GPImage.GetFrameCount(GDIPAPI.FrameDimensionPage); 

アクティブフレームの使用を設定します。

関連する問題