创建和保存多帧图像

使用某些文件格式,可以将多个图像 (帧) 保存到单个文件中。 例如,可以将多个页面保存到单个 TIFF 文件中。 若要保存第一页,请调用 Image 类的 Save 方法。 若要保存后续页面,请调用 Image 类的 SaveAdd 方法。

注意

不能使用 SaveAdd 向动态 gif 文件添加帧。

 

以下控制台应用程序创建包含四页的 TIFF 文件。 成为 TIFF 文件页的图像来自四个磁盘文件:Shapes.bmp、Cereal.gif、Iron.jpg和House.png。 该代码首先构造四个 Image 对象: multipage2page3page4。 最初, multi 仅包含Shapes.bmp中的图像,但最终包含所有四个图像。 当单个页面添加到 图像 对象时,它们也会添加到磁盘文件 Multiframe.tif 中。

请注意,代码调用 Save (not SaveAdd) 来保存第一页。 传递给 Save 方法的第一个参数是最终将包含多个帧的磁盘文件的名称。 传递给 Save 方法的第二个参数指定编码器,该编码器将用于将 图像 对象中的数据转换为 (在本例中 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 对象的地址。 区别在于,Value 成员指向的 ULONG 现在包含值 EncoderValueFrameDimensionPage。

main 函数依赖于帮助程序函数 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;
}