确定编码器支持的参数

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 枚举和方法: