Определение параметров, поддерживаемых кодировщиком
Класс 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 в массиве имеет следующие четыре открытых элемента данных:
Следующий код является продолжением консольного приложения, показанного в предыдущем примере. Код просматривает второй объект EncoderParameter в массиве, возвращаемом Image::GetEncoderParameterList. Код вызывает StringFromGUID2, которая является системной функцией, объявленной в Objbase.h, для преобразования элемента GUID объекта EncoderParameter в строку.
// 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.
Вы можете найти GUID в Gdiplusimaging.h и выяснить, что категория этого объекта EncoderParameter — EncoderQuality. Эту категорию (EncoderQuality) параметра можно использовать для задания уровня сжатия изображения JPEG.
В Gdiplusenums.h перечисление EncoderParameterValueType указывает, что тип данных 6 — ValueLongRange. Большой диапазон — это пара значений ULONG .
Количество значений равно 1, поэтому мы знаем, что элемент Value объекта EncoderParameter является указателем на массив, содержащий один элемент. Один элемент является парой значений 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 , которые указывают минимальное и максимальное возможные значения для параметра quality. В некоторых случаях значения, возвращаемые в объекте EncoderParameter , являются членами перечисления EncoderValue . В следующих разделах подробно рассматривается перечисление EncoderValue и методы для перечисления возможных значений параметров.