作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个图像文件 (.tiff),其中包含 4 个图像。我无法在 TImage 中查看或显示这 4 个图像。TImage组件仅显示第一帧。
如何按图显示?
最佳答案
VCL 通过 Windows 成像组件支持 tif 图像,该组件由 TWICImage
封装。 。然而,虽然微不足道,VCL 却忽略了 WIC 的帧支持(术语 MS documentation 用于指代图像中的多个图像)。
以下引用来自XE2的“Vcl.Graphics.pas”。
procedure TWICImage.LoadFromStream(Stream: TStream);
var
..
BitmapDecoder: IWICBitmapDecoder;
...
begin
...
WicCheck(BitmapDecoder.GetFrame(0, LBitmapFrame));
...
end;
我只引用了一行,它立即显示了问题。 “解码器”能够提供总帧计数信息并检索其中的任何一个。但是,按照编码,只使用了第一个。
仍然可以使用TWICImage
本身来检索帧,然后将其分配给TImage
的图片。下面是我这样做的尝试,它本质上重复了 TWICImage.LoadFromStream 中的代码,不同之处在于只使用了第二帧:)。不管怎样,应该很容易模块化才能得到 frame count并显示所需的内容。
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
WICImage: TWICImage;
end;
var
Form1: TForm1;
implementation
uses
activex, wincodec, consts;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
procedure Check(Result: HRESULT);
begin
if Failed(Result) then
raise EInvalidGraphic.Create(SInvalidImage);
end;
var
fs: TFileStream;
Adapter: IStream;
Decoder: IWICBitmapDecoder;
Frame: IWICBitmapFrameDecode;
WICBmp: IWICBitmap;
Width, Height: DWORD;
begin
fs := TFileStream.Create('....tif', fmShareDenyWrite);
try
Adapter := TStreamAdapter.Create(fs);
Check(WICImage.ImagingFactory.CreateDecoderFromStream(Adapter,
GUID_ContainerFormatTiff, WICDecodeMetadataCacheOnDemand, Decoder));
Check(Decoder.GetFrame(1, Frame));
Check(WICImage.ImagingFactory.CreateBitmapFromSource(Frame,
WICBitmapCacheOnLoad, WICBmp));
Check(WICBmp.GetSize(Width, Height));
Image1.Width := Width;
Image1.Height := Height;
WICImage.Handle := WICBmp;
Image1.Picture.Bitmap.Assign(WICImage);
finally
fs.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WICImage := TWICImage.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
WICImage.Free;
end;
请注意,我不喜欢将 WIC 图像作为表单的字段而不是局部变量。但我在程序关闭时不断收到 AV 和运行时错误,当它是本地时我无法解决。
关于Delphi:如何在Timage组件中按图像显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40512621/
我是一名优秀的程序员,十分优秀!