인코더에서 지원하는 매개 변수 확인
Image 클래스는 지정된 이미지 인코더에서 지원하는 매개 변수를 확인할 수 있도록 Image::GetEncoderParameterList 메서드를 제공합니다. Image::GetEncoderParameterList 메서드는 EncoderParameter 개체의 배열을 반환합니다. Image::GetEncoderParameterList를 호출하기 전에 해당 배열을 수신하려면 버퍼를 할당해야 합니다. Image::GetEncoderParameterListSize를 호출하여 필요한 버퍼의 크기를 확인할 수 있습니다.
다음 콘솔 애플리케이션은 JPEG 인코더에 대한 매개 변수 목록을 가져옵니다. 기본 함수는 인코더에 대한 클래스 식별자 검색에 표시된 도우미 함수 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 개체에는 다음과 같은 4개의 공용 데이터 멤버가 있습니다.
다음 코드는 앞의 예제에 표시된 콘솔 애플리케이션의 연속입니다. 이 코드는 Image:: GetEncoderParameterList 에서 반환된 배열의 두 번째 EncoderParameter 개체를 확인합니다. 코드는 Objbase.h에 선언된 시스템 함수인 StringFromGUID2를 호출하여 EncoderParameter 개체의 Guid 멤버를 문자열로 변환합니다.
// 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.
Gdiplusimaging.h에서 GUID를 조회하고 이 EncoderParameter 개체의 범주가 EncoderQuality임을 확인할 수 있습니다. 매개 변수의 이 범주(EncoderQuality)를 사용하여 JPEG 이미지의 압축 수준을 설정할 수 있습니다.
Gdiplusenums.h에서 EncoderParameterValueType 열거형은 데이터 형식 6이 ValueLongRange임을 나타냅니다. 긴 범위는 ULONG 값 쌍입니다.
값 수는 1이므로 EncoderParameter 개체의 Value 멤버가 하나의 요소가 있는 배열에 대한 포인터임을 알 수 있습니다. 한 요소는 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 값 쌍입니다. 경우에 따라 EncoderParameter 개체에 반환된 값은 EncoderValue 열거형의 멤버입니다. 다음 topics EncoderValue 열거형 및 가능한 매개 변수 값을 더 자세히 나열하는 메서드에 대해 설명합니다.