エンコーダーでサポートされるパラメーターの決定
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 列挙と、使用可能なパラメーター値を一覧表示するためのメソッドについて詳しく説明します。