共用方式為


建立和儲存多框架影像

使用特定檔案格式,您可以將多個影像儲存 (框架) 到單一檔案。 例如,您可以將數個頁面儲存到單一 TIFF 檔案。 若要儲存第一頁,請呼叫Image類別的Save方法。 若要儲存後續的頁面,請呼叫Image類別的SaveAdd方法。

注意

您無法使用 SaveAdd 將畫面新增至動畫 gif 檔案。

 

下列主控台應用程式會建立具有四個頁面的 TIFF 檔案。 成為 TIFF 檔案頁面的映射來自四個磁片檔案:Shapes.bmp、Cereal.gif、Iron.jpg和House.png。 程式碼會先建構四個Image物件:multipage2、page3page4 一開始, multi 只包含來自Shapes.bmp的映射,但最終會包含這四個影像。 隨著個別頁面新增至 多重Image 物件,它們也會新增至磁片檔 Multiframe.tif。

請注意,程式碼會呼叫 Save (not SaveAdd) 以儲存第一頁。 傳遞至 Save 方法的第一個引數是最終將包含數個畫面的磁片檔案名。 傳遞至 Save 方法的第二個引數會指定用來將 多重Image 物件中的資料轉換成磁片檔案所需的格式 (的編碼器 () 。 該相同的編碼器會自動由所有後續呼叫 MultiImage 物件的 SaveAdd 方法使用。

傳遞至 Save 方法的第三個引數是 EncoderParameters 物件的位址。 EncoderParameters物件具有包含單一EncoderParameter物件的陣列。 該EncoderParameter物件的Guid成員會設定為 EncoderSaveFlag。 EncoderParameter物件的Value成員會指向包含 EncoderValueMultiFrame 值的ULONG

程式碼會呼叫多重Image物件的SaveAdd方法,以儲存第二頁、第三頁和第四頁。 傳遞至 SaveAdd 方法的第一個引數是 Image 物件的位址。 該 Image 物件中的 影像 會新增至 多重Image 物件,也會新增至 Multiframe.tif 磁片檔案。 傳遞至 SaveAdd 方法的第二個引數是Save方法所使用的相同EncoderParameters物件的位址。 差異在於Value成員所指向的ULONG現在包含 EncoderValueFrameDimensionPage 值。

主要函式依賴協助程式函式 GetEncoderClsid,其顯示在 擷取編碼器的類別識別碼中。

#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
using namespace Gdiplus;

INT GetEncoderClsid(const WCHAR* format, CLSID* pClsid);  // helper function

INT main()
{
   // Initialize GDI+.
   GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR gdiplusToken;
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

   EncoderParameters encoderParameters;
   ULONG             parameterValue;
   Status            stat;

   // An EncoderParameters object has an array of
   // EncoderParameter objects. In this case, there is only
   // one EncoderParameter object in the array.
   encoderParameters.Count = 1;

   // Initialize the one EncoderParameter object.
   encoderParameters.Parameter[0].Guid = EncoderSaveFlag;
   encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
   encoderParameters.Parameter[0].NumberOfValues = 1;
   encoderParameters.Parameter[0].Value = &parameterValue;

   // Get the CLSID of the TIFF encoder.
   CLSID encoderClsid;
   GetEncoderClsid(L"image/tiff", &encoderClsid);

   // Create four image objects.
   Image* multi = new Image(L"Shapes.bmp");
   Image* page2 = new Image(L"Cereal.gif");
   Image* page3 = new Image(L"Iron.jpg");
   Image* page4 = new Image(L"House.png");

   // Save the first page (frame).
   parameterValue = EncoderValueMultiFrame;
   stat = multi->Save(L"MultiFrame.tif", &encoderClsid, &encoderParameters);
   if(stat == Ok)
      printf("Page 1 saved successfully.\n");

   // Save the second page (frame).
   parameterValue = EncoderValueFrameDimensionPage;
   stat = multi->SaveAdd(page2, &encoderParameters);
   if(stat == Ok)
      printf("Page 2 saved successfully.\n");

   // Save the third page (frame).
   parameterValue = EncoderValueFrameDimensionPage;
   stat = multi->SaveAdd(page3, &encoderParameters);
   if(stat == Ok)
      printf("Page 3 saved successfully.\n");

   // Save the fourth page (frame).
   parameterValue = EncoderValueFrameDimensionPage;
   stat = multi->SaveAdd(page4, &encoderParameters);
   if(stat == Ok)
      printf("Page 4 saved successfully.\n");

   // Close the multiframe file.
   parameterValue = EncoderValueFlush;
   stat = multi->SaveAdd(&encoderParameters);
   if(stat == Ok)
      printf("File closed successfully.\n");

   delete multi;
   delete page2;
   delete page3;
   delete page4;
   GdiplusShutdown(gdiplusToken);
   return 0;
}