程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> GdiPlus[56]: 圖像(八) 關於多幀圖像

GdiPlus[56]: 圖像(八) 關於多幀圖像

編輯:Delphi

 TIFF 與 GIF 是多幀圖像; GIF 還可以關聯時間形成動畫.

  在編碼或解碼多幀圖像的過程中會用到下面兩個常數值:

  FrameDimensionPage (用於 TIFF)

  FrameDimensionTime (用於 GIF)

  GDI+1.0 不能編碼 GIF 動畫; 但都能解析.

  解析 TIFF 多頁圖像的例子:

GdiPlus[56]: 圖像(八) 關於多幀圖像

  查看原圖(大圖)

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 使用):

GdiPlus[56]: 圖像(八) 關於多幀圖像

 這是解析結果:

GdiPlus[56]: 圖像(八) 關於多幀圖像

  查看原圖(大圖)

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; 



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved