Image 類別提供 Image::GetEncoderParameterList 方法,讓您可以判斷指定影像編碼器所支援的參數。 Image::GetEncoderParameterList 方法會傳回 EncoderParameter 物件的陣列。 呼叫 Image::GetEncoderParameterList 之前,您必須先配置緩衝區來接收該陣列。 您可以呼叫 Image::GetEncoderParameterListSize 來判斷所需緩衝區的大小。
下列主控台應用程式會取得 JPEG 編碼器的參數清單。 main 函式依賴 Helper 函式 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 物件都有下列四個公用數據成員:
下列程式代碼是上述範例所示的主控台應用程式的接續。 程式碼會檢視 Image::GetEncoderParameterList所傳回的陣列中第二個 EncoderParameter 物件。 程序代碼會呼叫 StringFromGUID2,這是 Objbase.h 中宣告的系統函式,將 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個,這樣我們就知道 Value 是 EncoderParameter 物件的成員,且這成員是指向一個只有一個元素的陣列的指標。 該元素是一對 ULONG 值。
下列程式代碼是主控台應用程式的接續,如上述兩個範例所示。 程式代碼會定義名為 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 列舉和方法,以列出可能的參數值: