Utilisation de l’énumération EncoderValue
Un encodeur donné prend en charge certaines catégories de paramètres, et pour chacune de ces catégories, cet encodeur autorise certaines valeurs. Par exemple, l’encodeur JPEG prend en charge la catégorie de paramètre EncoderValueQuality, et les valeurs de paramètre autorisées sont les entiers de 0 à 100. Certaines des valeurs de paramètre autorisées sont les mêmes sur plusieurs encodeurs. Ces valeurs standard sont définies dans l’énumération EncoderValue dans Gdiplusenums. h :
enum EncoderValue
{
EncoderValueColorTypeCMYK, // 0
EncoderValueColorTypeYCCK, // 1
EncoderValueCompressionLZW, // 2
EncoderValueCompressionCCITT3, // 3
EncoderValueCompressionCCITT4, // 4
EncoderValueCompressionRle, // 5
EncoderValueCompressionNone, // 6
EncoderValueScanMethodInterlaced, // 7
EncoderValueScanMethodNonInterlaced, // 8
EncoderValueVersionGif87, // 9
EncoderValueVersionGif89, // 10
EncoderValueRenderProgressive, // 11
EncoderValueRenderNonProgressive, // 12
EncoderValueTransformRotate90, // 13
EncoderValueTransformRotate180, // 14
EncoderValueTransformRotate270, // 15
EncoderValueTransformFlipHorizontal, // 16
EncoderValueTransformFlipVertical, // 17
EncoderValueMultiFrame, // 18
EncoderValueLastFrame, // 19
EncoderValueFlush, // 20
EncoderValueFrameDimensionTime, // 21
EncoderValueFrameDimensionResolution, // 22
EncoderValueFrameDimensionPage // 23
};
L’une des catégories de paramètres prises en charge par l’encodeur JPEG est la catégorie EncoderTransformation. En examinant l’énumération EncoderValue , vous pouvez spéculer (et être correct) que la catégorie EncoderTransformation autorise les cinq valeurs suivantes :
EncoderValueTransformRotate90, // 13
EncoderValueTransformRotate180, // 14
EncoderValueTransformRotate270, // 15
EncoderValueTransformFlipHorizontal, // 16
EncoderValueTransformFlipVertical, // 17
L’application console suivante vérifie que l’encodeur JPEG prend en charge la catégorie de paramètres EncoderTransformation et qu’il y a cinq valeurs autorisées pour ce paramètre. La fonction main repose sur la fonction d’assistance GetEncoderClsid, qui est indiquée dans récupération de l’identificateur de classe pour un encodeur.
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
using namespace Gdiplus;
INT GetEncoderClsid(const WCHAR* format, CLSID* pClsid);
INT main()
{
// Initialize GDI+.
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
// Create a 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);
// Look at the first (index 0) EncoderParameter object in the array.
printf("Parameter[0]\n");
WCHAR strGuid[39];
StringFromGUID2(pEncoderParameters->Parameter[0].Guid, strGuid, 39);
wprintf(L" The guid is %s.\n", strGuid);
printf(" The data type is %d.\n",
pEncoderParameters->Parameter[0].Type);
printf(" The number of values is %d.\n",
pEncoderParameters->Parameter[0].NumberOfValues);
free(pEncoderParameters);
delete bitmap;
GdiplusShutdown(gdiplusToken);
return 0;
}
Lorsque vous exécutez l’application console précédente, vous recevez une sortie similaire à ce qui suit :
The parameter list requires 172 bytes.
There are 4 EncoderParameter objects in the array.
Parameter[0]
The GUID is {8D0EB2D1-A58E-4EA8-AA14-108074B7B6F9}.
The value type is 4.
The number of values is 5.
Vous pouvez rechercher le GUID dans Gdiplusimaging. h et savoir que la catégorie de cet objet EncoderParameter est EncoderTransformation. Dans Gdiplusenums. h, l’énumération EncoderParameterValueType indique que le type de données 4 est ValueLong (entier non signé 32 bits). Le nombre de valeurs étant de cinq, nous savons que le membre value de l’objet EncoderParameter est un pointeur vers un tableau de cinq valeurs ULong .
Le code suivant est une suite de l’application console qui est présentée dans l’exemple précédent. Le code répertorie les valeurs autorisées pour un paramètre EncoderTransformation :
ULONG* pUlong = (ULONG*)(pEncoderParameters->Parameter[0].Value);
ULONG numVals = pEncoderParameters->Parameter[0].NumberOfValues;
printf("%s", " The allowable values are");
for(ULONG j = 0; j < numVals; ++j)
{
printf(" %d", pUlong[j]);
}
Le code ci-dessus génère la sortie suivante :
The allowable values are 13 14 15 16 17
Les valeurs autorisées (13, 14, 15, 16 et 17) correspondent aux membres suivants de l’énumération EncoderValue :
EncoderValueTransformRotate90, // 13
EncoderValueTransformRotate180, // 14
EncoderValueTransformRotate270, // 15
EncoderValueTransformFlipHorizontal, // 16
EncoderValueTransformFlipVertical, // 17