2011-10-21 84 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扩展,这将是一个班轮,image1.Picture.LoadFromFile(MyTiffFile)。否则,这个SO问题可能会帮助你[如何加载任意图像从一个blob流到一个图像](http://stackoverflow.com/questions/6251504/how-加载任意图像从blob流到一个图像) –

+0

我不知道这段代码是否来自http://www.swissdelphicenter.ch/en/showcode.php中的示例?id = 2012(2004年)。我只是在我工作的代码库的一个很少探索的部分中找到了相同的代码。 –

回答

2

正如我在评论说,如果文件扩展名是标准的TIFF扩展的代码来打开文件很简单:

image1.Picture.LoadFromFile(MyTiffFile); 

如果没有,请从dwrbudr答案。

下面是一个例子:

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; 

又见TWICImage,它适用于XP SP3以上。

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


编辑: GDI + TGPImage还支持多个TIFF帧/ pages:

要获得帧计数使用:

GPImage.GetFrameCount(GDIPAPI.FrameDimensionPage); 

要设置活动帧使用:

GPImage.SelectActiveFrame(GDIPAPI.FrameDimensionPage, Index); 

注意TSynPicture还支持多帧。

相关问题