我目前正在开发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 := TWICImage.Create;
tiff.LoadFromFile(Filename);
ABitmap.Assign(tiff);
您可以使用
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 框架/页面:
要获取帧数,请使用:
GPImage.GetFrameCount(GDIPAPI.FrameDimensionPage);
要设置活动框架,请使用:
GPImage.SelectActiveFrame(GDIPAPI.FrameDimensionPage, Index);
TSynPicture
还支持多个框架。
正如我的评论中所述,如果文件扩展名是标准 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 及更高版本。
此外,如果 TIF 包含多个图像,您可以在加载 TWicImage 中的图像之前使用 FrameIndex 属性指定要加载的图像
使用 FrameCount,您可以获得 TIF 文件中可用图像的数量
FrameIndex 范围为 0 到 FrameCount-1