判斷編碼器支援的參數
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 值。
值數目為一,因此我們知道EncoderParameter物件的Value成員是具有一個元素之陣列的指標。 該元素是一對 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 列舉和列出可能參數值的方法: