Freigeben über


Ermitteln der von einem Encoder unterstützten Parameter

Die Image-Klasse stellt die Image::GetEncoderParameterList-Methode bereit, sodass Sie die Parameter bestimmen können, die von einem bestimmten Bildencoder unterstützt werden. Die Image::GetEncoderParameterList-Methode gibt ein Array von EncoderParameter-Objekten zurück. Sie müssen einen Puffer zuweisen, um dieses Array zu empfangen, bevor Sie Image::GetEncoderParameterList aufrufen. Sie können Image::GetEncoderParameterListSize aufrufen, um die Größe des erforderlichen Puffers zu bestimmen.

Die folgende Konsolenanwendung ruft die Parameterliste für den JPEG-Encoder ab. Die Standard-Funktion basiert auf der Hilfsfunktion GetEncoderClsid, die unter Abrufen des Klassenbezeichners für einen Encoder angezeigt wird.

#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;
}

Wenn Sie die vorherige Konsolenanwendung ausführen, erhalten Sie eine Ausgabe ähnlich der folgenden:

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

Jedes EncoderParameter-Objekt im Array verfügt über die folgenden vier öffentlichen Datenmber:

Der folgende Code ist eine Fortsetzung der Konsolenanwendung, die im vorherigen Beispiel gezeigt wurde. Der Code untersucht das zweite EncoderParameter-Objekt im Array, das von Image::GetEncoderParameterList zurückgegeben wird. Der Code ruft StringFromGUID2 auf, eine in Objbase.h deklarierte Systemfunktion, um das Guid-Element des EncoderParameter-Objekts in eine Zeichenfolge zu konvertieren.

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

Der oben genannte Code erzeugt die folgende Ausgabe:

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

Sie können die GUID in Gdiplusimaging.h suchen und feststellen, dass die Kategorie dieses EncoderParameter-Objekts EncoderQuality ist. Sie können diese Kategorie (EncoderQuality) des Parameters verwenden, um die Komprimierungsebene eines JPEG-Bilds festzulegen.

In Gdiplusenums.h gibt die EncoderParameterValueType-Enumeration an, dass der Datentyp 6 ValueLongRange ist. Ein langer Bereich ist ein Paar von ULONG-Werten .

Die Anzahl der Werte ist eins, daher wissen wir, dass das Value-Element des EncoderParameter-Objekts ein Zeiger auf ein Array ist, das ein Element hat. Dieses eine Element ist ein Paar von ULONG-Werten .

Der folgende Code ist eine Fortsetzung der Konsolenanwendung, die in den beiden vorherigen Beispielen gezeigt wird. Der Code definiert einen Datentyp namens PLONGRANGE (Zeiger auf einen langen Bereich). Eine Variable vom Typ PLONGRANGE wird verwendet, um die Minimal- und Höchstwerte zu extrahieren, die als Qualitätseinstellung an den JPEG-Encoder übergeben werden können.

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

Der oben genannte Code erzeugt die folgende Ausgabe:

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

Im vorherigen Beispiel ist der im EncoderParameter-Objekt zurückgegebene Wert ein Paar von ULONG-Werten , die die minimalen und maximalen möglichen Werte für den Qualitätsparameter angeben. In einigen Fällen sind die in einem EncoderParameter-Objekt zurückgegebenen Werte Member der EncoderValue-Enumeration . In den folgenden Themen werden die EncoderValue-Enumeration und -Methoden zum Auflisten möglicher Parameterwerte ausführlicher erläutert: