确定编码器支持的参数
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 枚举和方法: