建立和儲存多框架影像
使用特定檔案格式,您可以將多個影像儲存 (框架) 到單一檔案。 例如,您可以將數個頁面儲存到單一 TIFF 檔案。 若要儲存第一頁,請呼叫Image類別的Save方法。 若要儲存後續的頁面,請呼叫Image類別的SaveAdd方法。
注意
您無法使用 SaveAdd 將畫面新增至動畫 gif 檔案。
下列主控台應用程式會建立具有四個頁面的 TIFF 檔案。 成為 TIFF 檔案頁面的映射來自四個磁片檔案:Shapes.bmp、Cereal.gif、Iron.jpg和House.png。 程式碼會先建構四個Image物件:multi、page2、page3和page4。 一開始, 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 = ¶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;
}