Share via


複数フレーム画像の作成と保存

特定のファイル形式では、複数のイメージ (フレーム) を 1 つのファイルに保存できます。 たとえば、複数のページを 1 つの TIFF ファイルに保存できます。 最初のページを保存するには、Image クラスの Save メソッドを呼び出します。 後続のページを保存するには、Image クラスの SaveAdd メソッドを呼び出します。

注意

SaveAdd を使用してアニメーション gif ファイルにフレームを追加することはできません。

 

次のコンソール アプリケーションは、4 ページの TIFF ファイルを作成します。 TIFF ファイルのページになるイメージは、Shapes.bmp、Cereal.gif、Iron.jpg、House.pngの 4 つのディスク ファイルから取得されます。 このコードでは、最初に 4 つの Image オブジェクト ( マルチページ 2ページ 3およびページ 4) を構築します。 最初は、 multi にはShapes.bmpのイメージのみが含まれますが、最終的には 4 つのイメージがすべて含まれます。 個々のページが 複数の Image オブジェクトに追加されると、ディスク ファイル Multiframe.tif にも追加されます。

コードは Save (SaveAdd ではなく) 呼び出して最初のページを保存します。 Save メソッドに渡される最初の引数は、最終的に複数のフレームを含むディスク ファイルの名前です。 Save メソッドに渡される 2 番目の引数は、 マルチImage オブジェクトのデータをディスク ファイルで必要な形式 (この場合は TIFF) に変換するために使用されるエンコーダーを指定します。 同じエンコーダーは、 複数の Image オブジェクトの SaveAdd メソッドに対する後続のすべての呼び出しによって自動的に使用されます。

Save メソッドに渡される 3 番目の引数は EncoderParameters オブジェクトのアドレスです。 EncoderParameters オブジェクトには、1 つの EncoderParameter オブジェクトを含む配列があります。 その EncoderParameter オブジェクトの Guid メンバーが EncoderSaveFlag に設定されています。 EncoderParameter オブジェクトの Value メンバーは、値 EncoderValueMultiFrame を含む ULONG を指します。

このコードでは、複数の Image オブジェクトの SaveAdd メソッドを呼び出して、2 番目、3 番目、および 4 番目のページを保存します。 SaveAdd メソッドに渡される最初の引数は、 Image オブジェクトのアドレスです。 その Image オブジェクト内の イメージ、マルチImage オブジェクトに追加され、Multiframe.tif ディスク ファイルにも追加されます。 SaveAdd メソッドに渡される 2 番目の引数は、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;
}