TIFF 與 GIF 是多幀圖像; GIF 還可以關聯時間形成動畫.
在編碼或解碼多幀圖像的過程中會用到下面兩個常數值:
FrameDimensionPage (用於 TIFF)
FrameDimensionTime (用於 GIF)
GDI+1.0 不能編碼 GIF 動畫; 但都能解析.
解析 TIFF 多頁圖像的例子:
查看原圖(大圖)
uses GdiPlus;
procedure TForm1.FormDblClick(Sender: TObject);
var
Image: IGPImage;
Graphics: IGPGraphics;
PageCount: Integer;
i: Integer;
begin
Image := TGPImage.Create('C:\GdiPlusImg\MultiFrame.tif' );
PageCount := Image.GetFrameCount(FrameDimensionPage);
Graphics := TGPGraphics.Create(Handle);
for i := 0 to PageCount - 1 do
begin
Image.SelectActiveFrame(FrameDimensionPage, i);
Graphics.DrawImage(Image, 10, 10, Image.Width, Image.Height);
Graphics.TranslateTransform(Image.Width + 10, 0);
end;
end;
解析 GIF 多幀圖像的例子:
這是原始 GIF 動畫文件(本例是放在 C:\GdiPlusImg\Chicken.gif 使用):
這是解析結果:
查看原圖(大圖)
uses GdiPlus;
procedure TForm1.FormDblClick(Sender: TObject);
var
Image: IGPImage;
Graphics: IGPGraphics;
PageCount: Integer;
i: Integer;
begin
Image := TGPImage.Create('C:\GdiPlusImg\Chicken.gif');
PageCount := Image.GetFrameCount(FrameDimensionTime);
Graphics := TGPGraphics.Create(Handle);
Graphics.Clear($FF000000);
for i := 0 to PageCount - 1 do
begin
Image.SelectActiveFrame(FrameDimensionTime, i);
Graphics.DrawImage(Image, 4, 4, Image.Width, Image.Height);
Graphics.TranslateTransform(Image.Width + 4, 0);
if (i+1) mod 7 = 0 then
begin
Graphics.TranslateTransform(-Graphics.Transform.OffsetX, Image.Height + 4);
end;
end;
end;
編碼 TIFF 多頁圖像的例子(可用 "Windows 圖片和傳真查看器" 查看編碼效果):
uses GdiPlus;
procedure TForm1.Button1Click(Sender: TObject);
var
Prams: IGPEncoderParameters;
Img1,Img2,Img3,Img4: IGPImage;
MultiFrameImgPath: string;
begin
ChDir('C:\GdiPlusImg\');
Img1 := TGPImage.Create('Apple.gif');
Img2 := TGPImage.Create('Bird.bmp');
Img3 := TGPImage.Create('Cereal.gif');
Img4 := TGPImage.Create('Collage.png');
MultiFrameImgPath := 'MultiFrame_Test.tif';
Prams := TGPEncoderParameters.Create;
Prams.Add(EncoderSaveFlag, EncoderValueMultiFrame);
Img1.Save(MultiFrameImgPath, TGPImageFormat.Tiff, Prams);
Prams.Clear;
Prams.Add(EncoderSaveFlag, EncoderValueFrameDimensionPage);
Img1.SaveAdd(Img2, Prams);
Img1.SaveAdd(Img3, Prams);
Img1.SaveAdd(Img4, Prams);
Prams.Clear;
Prams.Add(EncoderSaveFlag, EncoderValueFlush);
Img1.SaveAdd(Prams);
end;
GDI+ 可以播放 gif 動畫嗎?
gif 動畫數據中還有時間間隔(它可能不一樣), 如果能讀出每幀的時間間隔就好辦了.
下面的代碼就把上面 Gif 動畫每幀的時間間隔讀入到了一個數組:
uses GdiPlus;
procedure TForm1.FormDblClick(Sender: TObject);
var
Image: IGPImage;
PropertyItem: IGPPropertyItem;
Count: Integer;
p: PCardinal;
FrameTimeArr: array of Cardinal;
begin
Image := TGPImage.Create('C:\GdiPlusImg\Chicken.gif');
{ 獲取 Gif 動畫的時間屬性, 這是一個 Cardinal 數組 }
PropertyItem := Image.GetPropertyItem(PropertyTagFrameDelay);
{ 幀總數 }
Count := PropertyItem.Length div 4;
{ 復制到需要的數組 }
SetLength(FrameTimeArr, Count);
CopyMemory(FrameTimeArr, PropertyItem.Value, PropertyItem.Length);
end;