使用 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 編碼器支援的其中一個參數類別是 EncoderTransformation 類別。 藉由檢查 EncoderValue 列舉,您可能會推測(而且這是正確的),EncoderTransformation 類別允許下列五種值:
EncoderValueTransformRotate90, // 13
EncoderValueTransformRotate180, // 14
EncoderValueTransformRotate270, // 15
EncoderValueTransformFlipHorizontal, // 16
EncoderValueTransformFlipVertical, // 17
下列主控台應用程式會驗證 JPEG 編碼器是否支援 EncoderTransformation 參數類別,而且這類參數有五個允許的值。 主要函式依賴輔助函式 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 位無符號整數)。 值數目為五,因此我們知道 EncoderParameter 物件的 Value 成員是五 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