建立和儲存 Multiple-Frame 映像
使用特定檔案格式,您可以將多個影像(框架)儲存至單一檔案。 例如,您可以將數個頁面儲存至單一 TIFF 檔案。 若要儲存第一頁,請呼叫 Image 類別的 Save 方法。 若要儲存後續頁面,請呼叫 Image 類別的 SaveAdd 方法。
注意
您無法使用 SaveAdd,將畫面新增至動畫 gif 檔案。
下列主控台應用程式會建立具有四個頁面的 TIFF 檔案。 成為 TIFF 檔案頁面的映像來自四個磁碟檔案:Shapes.bmp、Cereal.gif、Iron.jpg和 House.png。 程式代碼會先建構四個 Image 物件:多重、page2、page3和 page4。 起初,多重 只包含來自 Shapes.bmp的映像,但最終會包含這四個影像。 當個別頁面新增至 多重Image 物件時,它們也會新增至磁碟檔案Multiframe.tif。
請注意,程式代碼會呼叫 Save (而非 SaveAdd),以儲存第一頁。 傳遞至 Save 方法的第一個自變數是最終將包含數個畫面的磁碟檔案名稱。 傳遞至 Save 方法的第二個自變數會指定編碼器,該編碼器將用來將磁碟檔案所需的 多重Image 物件中的數據轉換成格式(在此案例中為 TIFF)。 所有後續對 多重Image 物件的 SaveAdd 方法的呼叫,都會自動使用相同的編碼器。
傳遞至 Save 方法的第三個自變數是 EncoderParameters 物件的位址。 EncoderParameters 物件具有一個包含單一 EncoderParameter 物件的陣列。 該 EncoderParameter 物件的 Guid 成員會設定為 EncoderSaveFlag。 EncoderParameter 物件的 Value 成員指向包含 EncoderValueMultiFrame 值的 ULONG。
程序代碼會呼叫 多重Image 物件的 SaveAdd 方法,以儲存第二、第三和第四頁。 傳遞至 SaveAdd 方法的第一個自變數是 image 物件的 位址。 該 Image 物件的影像會新增至 多重Image 物件,也會新增至Multiframe.tif磁碟檔案。 傳遞至 SaveAdd 方法的第二個自變數是與 Save 方法 所使用的相同 EncoderParameters 物件位址。 差異在於,ULONG 現在由 Value 成員所指向,並包含 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 = ¶meterValue;
// 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;
}