Partager via


Détermination des paramètres pris en charge par un encodeur

La classe Image fournit la méthode Image::GetEncoderParameterList afin que vous puissiez déterminer les paramètres pris en charge par un encodeur d’image donné. La méthode Image::GetEncoderParameterList retourne un tableau d’objets EncoderParameter . Vous devez allouer une mémoire tampon pour recevoir ce tableau avant d’appeler Image::GetEncoderParameterList. Vous pouvez appeler Image::GetEncoderParameterListSize pour déterminer la taille de la mémoire tampon requise.

L’application console suivante obtient la liste des paramètres de l’encodeur JPEG. La fonction main s’appuie sur la fonction d’assistance GetEncoderClsid, qui est illustré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);  // 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;
}

Lorsque vous exécutez l’application console précédente, vous obtenez une sortie similaire à ce qui suit :

The parameter list requires 172 bytes.
There are 4 EncoderParameter objects in the array.

Chacun des objets EncoderParameter du tableau a les quatre membres de données publics suivants :

Le code suivant est une continuation de l’application console illustrée dans l’exemple précédent. Le code examine le deuxième objet EncoderParameter dans le tableau retourné par Image::GetEncoderParameterList. Le code appelle StringFromGUID2, qui est une fonction système déclarée dans Objbase.h, pour convertir le membre GUID de l’objet EncoderParameter en chaîne.

// 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);

Le code ci-dessus génère la sortie suivante :

Parameter[1]
   The GUID is {1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}.
   The value type is 6.
   The number of values is 1.

Vous pouvez rechercher le GUID dans Gdiplusimaging.h et découvrir que la catégorie de cet objet EncoderParameter est EncoderQuality. Vous pouvez utiliser cette catégorie (EncoderQuality) du paramètre pour définir le niveau de compression d’une image JPEG.

Dans Gdiplusenums.h, l’énumération EncoderParameterValueType indique que le type de données 6 est ValueLongRange. Une longue plage est une paire de valeurs ULONG .

Le nombre de valeurs étant une, nous savons que le membre Value de l’objet EncoderParameter est un pointeur vers un tableau qui a un élément. Cet élément est une paire de valeurs ULONG .

Le code suivant est une continuation de l’application console illustrée dans les deux exemples précédents. Le code définit un type de données appelé PLONGRANGE (pointeur vers une longue plage). Une variable de type PLONGRANGE permet d’extraire les valeurs minimales et maximales qui peuvent être passées en tant que paramètre de qualité à l’encodeur 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);

Le code ci-dessus génère la sortie suivante :

The minimum possible quality value is 0.
The maximum possible quality value is 100.

Dans l’exemple précédent, la valeur retournée dans l’objet EncoderParameter est une paire de valeurs ULONG qui indiquent les valeurs minimales et maximales possibles pour le paramètre de qualité. Dans certains cas, les valeurs retournées dans un objet EncoderParameter sont membres de l’énumération EncoderValue . Les rubriques suivantes décrivent l’énumération Et les méthodes EncoderValue pour répertorier les valeurs de paramètre possibles plus en détail :