次の方法で共有


EncoderValue 列挙の使用

特定のエンコーダーは特定のパラメーター カテゴリをサポートしており、それらのカテゴリごとに、そのエンコーダーは特定の値を許可します。 たとえば、JPEG エンコーダーは EncoderValueQuality パラメーター カテゴリをサポートし、許容されるパラメーター値は 0 ~ 100 の整数です。 許容されるパラメーター値の一部は、複数のエンコーダーで同じです。 これらの標準値は、Gdiplusenums.h の EncoderValue 列挙で定義されています。

enum EncoderValue
{
   EncoderValueColorTypeCMYK,             // 0
   EncoderValueColorTypeYCCK,             // 1
   EncoderValueCompressionLZW,            // 2
   EncoderValueCompressionCCITT3,         // 3
   EncoderValueCompressionCCITT4,         // 4
   EncoderValueCompressionRle,            // 5
   EncoderValueCompressionNone,           // 6
   EncoderValueScanMethodInterlaced,      // 7
   EncoderValueScanMethodNonInterlaced,   // 8
   EncoderValueVersionGif87,              // 9
   EncoderValueVersionGif89,              // 10
   EncoderValueRenderProgressive,         // 11
   EncoderValueRenderNonProgressive,      // 12
   EncoderValueTransformRotate90,         // 13
   EncoderValueTransformRotate180,        // 14
   EncoderValueTransformRotate270,        // 15
   EncoderValueTransformFlipHorizontal,   // 16
   EncoderValueTransformFlipVertical,     // 17
   EncoderValueMultiFrame,                // 18
   EncoderValueLastFrame,                 // 19
   EncoderValueFlush,                     // 20
   EncoderValueFrameDimensionTime,        // 21
   EncoderValueFrameDimensionResolution,  // 22
   EncoderValueFrameDimensionPage         // 23
};

JPEG エンコーダーでサポートされているパラメーター カテゴリの 1 つに EncoderTransformation カテゴリがあります。 EncoderValue 列挙体を調べることで、EncoderTransformation カテゴリで次の 5 つの値が許可されると推測できます (正しいでしょう)。

EncoderValueTransformRotate90,          // 13
EncoderValueTransformRotate180,         // 14
EncoderValueTransformRotate270,         // 15
EncoderValueTransformFlipHorizontal,    // 16
EncoderValueTransformFlipVertical,      // 17

次のコンソール アプリケーションは、JPEG エンコーダーが EncoderTransformation パラメーター カテゴリをサポートしていること、およびそのようなパラメーターに 5 つの許容値があることを確認します。 メイン関数は、ヘルパー関数 GetEncoderClsid に依存しています。これは、「エンコーダーのクラス識別子の取得」に示されています。

#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
using namespace Gdiplus;
INT GetEncoderClsid(const WCHAR* format, CLSID* pClsid);
INT main()
{
   // Initialize GDI+.
   GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR gdiplusToken;
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
   // Create a 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);
   // Look at the first (index 0) EncoderParameter object in the array.
   printf("Parameter[0]\n");
   WCHAR strGuid[39];
   StringFromGUID2(pEncoderParameters->Parameter[0].Guid, strGuid, 39);
   wprintf(L"   The guid is %s.\n", strGuid);
   printf("   The data type is %d.\n", 
      pEncoderParameters->Parameter[0].Type);
   printf("   The number of values is %d.\n",
      pEncoderParameters->Parameter[0].NumberOfValues);
   free(pEncoderParameters);
   delete bitmap;
   GdiplusShutdown(gdiplusToken);
   return 0;
}

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

The parameter list requires 172 bytes.
There are 4 EncoderParameter objects in the array.
Parameter[0]
   The GUID is {8D0EB2D1-A58E-4EA8-AA14-108074B7B6F9}.
   The value type is 4.
   The number of values is 5.

Gdiplusimaging.h で GUID を検索し、この EncoderParameter オブジェクトのカテゴリが EncoderTransformation であることを確認できます。 Gdiplusenums.h の EncoderParameterValueType 列挙は、データ型 4 が ValueLong (32 ビット符号なし整数) であることを示します。 値の数は 5 であるため、EncoderParameter オブジェクトの Value メンバーは 5 つの ULONG 値の配列へのポインターであることがわかります。

次のコードは、前の例で示したコンソール アプリケーションの継続です。 このコードでは、EncoderTransformation パラメーターの許容値を一覧表示します。

ULONG* pUlong = (ULONG*)(pEncoderParameters->Parameter[0].Value);
ULONG numVals = pEncoderParameters->Parameter[0].NumberOfValues;
printf("%s", "   The allowable values are");
for(ULONG j = 0; j < numVals; ++j)
{
   printf("  %d", pUlong[j]);
}

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

The allowable values are  13  14  15  16  17

使用できる値 (13、14、15、16、17) は、 EncoderValue 列挙の次のメンバーに対応します。

EncoderValueTransformRotate90,        // 13
EncoderValueTransformRotate180,       // 14
EncoderValueTransformRotate270,       // 15
EncoderValueTransformFlipHorizontal,  // 16
EncoderValueTransformFlipVertical,    // 17