次の方法で共有


エンコーダーでサポートされるパラメーターの決定

Image クラスには Image::GetEncoderParameterList メソッドが用意されているため、特定のイメージ エンコーダーでサポートされているパラメーターを決定できます。 Image::GetEncoderParameterList メソッドは EncoderParameter オブジェクトの配列を返します。 Image::GetEncoderParameterList を呼び出す前に、その配列を受け取るバッファーを割り当てる必要があります。 Image::GetEncoderParameterListSize を呼び出して、必要なバッファーのサイズを決定できます。

次のコンソール アプリケーションは、JPEG エンコーダーのパラメーター リストを取得します。 メイン関数は、ヘルパー関数 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);

   // Create Bitmap (inherited from Image) object so that we can call
   // GetParameterListSize and GetParameterList.
   Bitmap* bitmap = new Bitmap(1, 1);

   // Get the JPEG encoder CLSID.
   CLSID encoderClsid;
   GetEncoderClsid(L"image/jpeg", &encoderClsid);

   // How big (in bytes) is the JPEG encoder's parameter list?
   UINT listSize = 0; 
   listSize = bitmap->GetEncoderParameterListSize(&encoderClsid);
   printf("The parameter list requires %d bytes.\n", listSize);

   // Allocate a buffer large enough to hold the parameter list.
   EncoderParameters* pEncoderParameters = NULL;
   pEncoderParameters = (EncoderParameters*)malloc(listSize);

   // Get the parameter list for the JPEG encoder.
   bitmap->GetEncoderParameterList(
      &encoderClsid, listSize, pEncoderParameters);

   // pEncoderParameters points to an EncoderParameters object, which
   // has a Count member and an array of EncoderParameter objects.
   // How many EncoderParameter objects are in the array?
   printf("There are %d EncoderParameter objects in the array.\n", 
      pEncoderParameters->Count);

   free(pEncoderParameters);
   delete(bitmap);
   GdiplusShutdown(gdiplusToken);
   return 0;
}

上記のコンソール アプリケーションを実行すると、次のような出力が得られます。

The parameter list requires 172 bytes.
There are 4 EncoderParameter objects in the array.

配列内の 各 EncoderParameter オブジェクトには、次の 4 つのパブリック データ メンバーがあります。

次のコードは、前の例で示したコンソール アプリケーションの続きです。 このコードでは、Image::GetEncoderParameterList によって返される配列内の 2 番目の EncoderParameter オブジェクトを調べます。 このコードは、Objbase.h で宣言されたシステム関数である StringFromGUID2 を呼び出して、EncoderParameter オブジェクトの Guid メンバーを文字列に変換します。

// Look at the second (index 1) EncoderParameter object in the array.
printf("Parameter[1]\n");

WCHAR strGuid[39];
StringFromGUID2(pEncoderParameters->Parameter[1].Guid, strGuid, 39);
wprintf(L"   The GUID is %s.\n", strGuid);

printf("   The value type is %d.\n", 
   pEncoderParameters->Parameter[1].Type);

printf("   The number of values is %d.\n",
   pEncoderParameters->Parameter[1].NumberOfValues);

上のコードを実行すると、次の出力が生成されます。

Parameter[1]
   The GUID is {1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}.
   The value type is 6.
   The number of values is 1.

Gdiplusimaging.h で GUID を調べることで、この EncoderParameter オブジェクトのカテゴリが EncoderQuality であることがわかります。 このパラメーターのカテゴリ (EncoderQuality) を使用して、JPEG イメージの圧縮レベルを設定できます。

Gdiplusenums.h の EncoderParameterValueType 列挙は、データ型 6 が ValueLongRange であることを示します。 長い範囲は ULONG 値のペアです。

値の数は 1 であるため、EncoderParameter オブジェクトの Value メンバーは、1 つの要素を持つ配列へのポインターであることがわかります。 その 1 つの要素は ULONG 値のペアです。

次のコードは、前の 2 つの例に示されているコンソール アプリケーションの続きです。 このコードでは、 PLONGRANGE (長い範囲へのポインター) と呼ばれるデータ型を定義します。 PLONGRANGE 型の変数を使用して、品質設定として JPEG エンコーダーに渡すことができる最小値と最大値を抽出します。

typedef struct
   {
      long min;
      long max;
   }* PLONGRANGE;

   PLONGRANGE pLongRange = 
      (PLONGRANGE)(pEncoderParameters->Parameter[1].Value);

   printf("   The minimum possible quality value is %d.\n",
      pLongRange->min);

   printf("   The maximum possible quality value is %d.\n",
      pLongRange->max);

上のコードを実行すると、次の出力が生成されます。

The minimum possible quality value is 0.
The maximum possible quality value is 100.

前の例では、 EncoderParameter オブジェクトで返される値は、品質パラメーターの可能な最小値と最大値を示す ULONG 値のペアです。 場合によっては、 EncoderParameter オブジェクトで返される値は EncoderValue 列挙のメンバーです。 次のトピックでは、 EncoderValue 列挙と、使用可能なパラメーター値を一覧表示するためのメソッドについて詳しく説明します。