共用方式為


判斷編碼器支持的參數

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個,這樣我們就知道 ValueEncoderParameter 物件的成員,且這成員是指向一個只有一個元素的陣列的指標。 該元素是一對 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 列舉和方法,以列出可能的參數值: