Menentukan Parameter yang Didukung oleh Encoder

Kelas Gambar menyediakan metode Image::GetEncoderParameterList sehingga Anda dapat menentukan parameter yang didukung oleh encoder gambar tertentu. Metode Image::GetEncoderParameterList mengembalikan array objek EncoderParameter . Anda harus mengalokasikan buffer untuk menerima array tersebut sebelum memanggil Image::GetEncoderParameterList. Anda dapat memanggil Image::GetEncoderParameterListSize untuk menentukan ukuran buffer yang diperlukan.

Aplikasi konsol berikut mendapatkan daftar parameter untuk encoder JPEG. Fungsi utama bergantung pada fungsi pembantu GetEncoderClsid, yang ditunjukkan dalam Mengambil Pengidentifikasi Kelas untuk Encoder.

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

Saat menjalankan aplikasi konsol sebelumnya, Anda mendapatkan output yang mirip dengan yang berikut ini:

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

Masing-masing objek EncoderParameter dalam array memiliki empat anggota data publik berikut:

Kode berikut adalah kelanjutan dari aplikasi konsol yang ditampilkan dalam contoh sebelumnya. Kode melihat objek EncoderParameter kedua dalam array yang dikembalikan oleh Image::GetEncoderParameterList. Kode ini memanggil StringFromGUID2, yang merupakan fungsi sistem yang dideklarasikan dalam Objbase.h, untuk mengonversi anggota Guid objek EncoderParameter menjadi string.

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

Kode sebelumnya menghasilkan output berikut:

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

Anda dapat mencari GUID di Gdiplusimaging.h dan mencari tahu bahwa kategori objek EncoderParameter ini adalah EncoderQuality. Anda dapat menggunakan kategori ini (EncoderQuality) parameter untuk mengatur tingkat pemadatan gambar JPEG.

Dalam Gdiplusenums.h, enumerasi EncoderParameterValueType menunjukkan bahwa data tipe 6 adalah ValueLongRange. Rentang panjang adalah sepasang nilai ULONG .

Jumlah nilai adalah satu, jadi kita tahu bahwa anggota Nilai objek EncoderParameter adalah penunjuk ke array yang memiliki satu elemen. Elemen itu adalah sepasang nilai ULONG .

Kode berikut adalah kelanjutan dari aplikasi konsol yang ditampilkan dalam dua contoh sebelumnya. Kode mendefinisikan jenis data yang disebut PLONGRANGE (penunjuk ke rentang panjang). Variabel jenis PLONGRANGE digunakan untuk mengekstrak nilai minimum dan maksimum yang dapat diteruskan sebagai pengaturan kualitas ke encoder 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);

Kode sebelumnya menghasilkan output berikut:

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

Dalam contoh sebelumnya, nilai yang dikembalikan dalam objek EncoderParameter adalah sepasang nilai ULONG yang menunjukkan nilai minimum dan maksimum yang mungkin untuk parameter kualitas. Dalam beberapa kasus, nilai yang dikembalikan dalam objek EncoderParameter adalah anggota enumerasi EncoderValue . Topik berikut membahas enumerasi dan metode EncoderValue untuk mencantumkan nilai parameter yang mungkin secara lebih rinci: