Delphi 如何在TImage控件中加载和显示tiff图像?

Delphi 如何在TImage控件中加载和显示tiff图像?,delphi,tiff,delphi-xe2,Delphi,Tiff,Delphi Xe2,我目前正在开发Delphi XE2试用版。我想在TImage控件中加载和显示TIFF图像,而不使用任何第三方组件/库 我尝试了下面的代码,但它不适合我 Procedure TForm1.Button1Click(Sender: TObject); Var OleGraphic : TOleGraphic; fs : TFileStream; Source

我目前正在开发Delphi XE2试用版。我想在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;

请注意。

如我在评论中所述,如果文件扩展名是标准tiff扩展名,则打开文件的代码很简单:

     tiff := TWICImage.Create;
     tiff.LoadFromFile(Filename);
     ABitmap.Assign(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;

另请参见,它适用于XP SP3及以上版本。

您可以使用
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
TsyncPicture
(GDI+wrapper):


编辑:GDI+
TGPImage
还支持多个tiff框架/页面:

要获取帧数,请使用:

GPImage.GetFrameCount(GDIPAPI.FrameDimensionPage);
要设置活动帧,请使用:

GPImage.SelectActiveFrame(GDIPAPI.FrameDimensionPage, Index);

请注意,它还支持多帧。

如果文件扩展名是标准的tiff扩展名,则它将是一行,即image1.Picture.LoadFromFile(mytiffile)。否则,这个问题可能会帮助您我想知道这个代码是否来自于(2004年)的示例。我只是在我工作的代码库中很少探索的部分中有效地发现了相同的代码。