Image 类提供 Image::GetEncoderParameterList 方法,以便你可以确定给定图像编码器支持的参数。 Image::GetEncoderParameterList 方法返回 EncoderParameter 对象的数组。 在调用 Image::GetEncoderParameterList 之前,必须分配一个缓冲区来接收该数组。 可以调用 Image::GetEncoderParameterListSize 来确定所需缓冲区的大小。
以下控制台应用程序获取 JPEG 编码器的参数列表。 main 函数依赖于帮助程序函数 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,因此我们知道 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 枚举和方法: