EncoderValue 열거형 사용
지정된 인코더는 특정 매개 변수 범주를 지원하며 각 범주에 대해 해당 인코더가 특정 값을 허용합니다. 예를 들어 JPEG 인코더는 EncoderValueQuality 매개 변수 범주를 지원하며 허용되는 매개 변수 값은 0에서 100까지의 정수입니다. 허용되는 매개 변수 값 중 일부는 여러 인코더에서 동일합니다. 이러한 표준 값은 Gdiplusenums.h의 EncoderValue 열거형에 정의되어 있습니다.
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
};
JPEG 인코더에서 지원하는 매개 변수 범주 중 하나는 EncoderTransformation 범주입니다. EncoderValue 열거형을 검사하여 EncoderTransformation 범주가 다음 5개의 값을 허용한다고 추측할 수 있습니다(그리고 정확할 수 있습니다).
EncoderValueTransformRotate90, // 13
EncoderValueTransformRotate180, // 14
EncoderValueTransformRotate270, // 15
EncoderValueTransformFlipHorizontal, // 16
EncoderValueTransformFlipVertical, // 17
다음 콘솔 애플리케이션은 JPEG 인코더가 EncoderTransformation 매개 변수 범주를 지원하고 이러한 매개 변수에 대해 5개의 허용 가능한 값이 있는지 확인합니다. 기본 함수는 인코더에 대한 클래스 식별자 검색에 표시된 도우미 함수 GetEncoderClsid를 사용합니다.
#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;
}
이전 콘솔 애플리케이션을 실행하면 다음과 유사한 출력이 표시됩니다.
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.
Gdiplusimaging.h에서 GUID를 조회하고 이 EncoderParameter 개체의 범주가 EncoderTransformation인지 확인할 수 있습니다. Gdiplusenums.h에서 EncoderParameterValueType 열거형은 데이터 형식 4가 ValueLong(32비트 부호 없는 정수)임을 나타냅니다. 값 수는 5이므로 EncoderParameter 개체의 Value 멤버가 ULONG 값 5개 배열에 대한 포인터임을 알 수 있습니다.
다음 코드는 이전 예제에 표시된 콘솔 애플리케이션의 연속입니다. 코드는 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]);
}
위에 있는 코드의 결과는 다음과 같습니다.
The allowable values are 13 14 15 16 17
허용되는 값(13, 14, 15, 16 및 17)은 EncoderValue 열거형의 다음 멤버에 해당합니다.
EncoderValueTransformRotate90, // 13
EncoderValueTransformRotate180, // 14
EncoderValueTransformRotate270, // 15
EncoderValueTransformFlipHorizontal, // 16
EncoderValueTransformFlipVertical, // 17