다중 프레임 이미지 만들기 및 저장

특정 파일 형식을 사용하면 여러 이미지(프레임)를 단일 파일에 저장할 수 있습니다. 예를 들어 여러 페이지를 단일 TIFF 파일에 저장할 수 있습니다. 첫 번째 페이지를 저장하려면 Image 클래스의 Save 메서드를 호출합니다. 후속 페이지를 저장하려면 Image 클래스의 SaveAdd 메서드를 호출합니다.

참고

SaveAdd를 사용하여 애니메이션 GIF 파일에 프레임을 추가할 수 없습니다.

 

다음 콘솔 애플리케이션은 4개의 페이지가 있는 TIFF 파일을 만듭니다. TIFF 파일의 페이지가 되는 이미지는 Shapes.bmp, Cereal.gif, Iron.jpg 및 House.png 네 개의 디스크 파일에서 가져옵니다. 이 코드는 먼저 4개의 Image 개체( multi, page2, page3page4)를 생성합니다. 처음에는 multi 가 Shapes.bmp 이미지만 포함하지만 결국에는 4개의 이미지가 모두 포함됩니다. 개별 페이지가 다중Image 개체에 추가되면 Multiframe.tif 디스크 파일에도 추가됩니다.

코드는 저장(SaveAdd 아님)을 호출하여 첫 번째 페이지를 저장합니다. Save 메서드에 전달된 첫 번째 인수는 결국 여러 프레임을 포함할 디스크 파일의 이름입니다. Save 메서드에 전달된 두 번째 인수는 다중Image 개체의 데이터를 디스크 파일에 필요한 형식(이 경우 TIFF)으로 변환하는 데 사용할 인코더를 지정합니다. 동일한 인코더는 다중Image 개체의 SaveAdd 메서드에 대한 모든 후속 호출에서 자동으로 사용됩니다.

Save 메서드에 전달된 세 번째 인수는 EncoderParameters 개체의 주소입니다. EncoderParameters 개체에는 단일 EncoderParameter 개체가 포함된 배열이 있습니다. 해당 EncoderParameter 개체의 Guid 멤버가 EncoderSaveFlag로 설정됩니다. EncoderParameter 개체의 Value 멤버는 EncoderValueMultiFrame 값이 포함된 ULONG을 가리킵니다.

이 코드는 다중Image 개체의 SaveAdd 메서드를 호출하여 두 번째, 세 번째 및 네 번째 페이지를 저장합니다. SaveAdd 메서드에 전달된 첫 번째 인수는 Image 개체의 주소입니다. 해당 Image 개체의 이미지가 다중Image 개체에 추가되고 Multiframe.tif 디스크 파일에도 추가됩니다. SaveAdd 메서드에 전달된 두 번째 인수는 Save 메서드에서 사용한 것과 동일한 EncoderParameters 개체의 주소입니다. 차이점은 Value 멤버가 가리키는 ULONG에 이제 EncoderValueFrameDimensionPage 값이 포함되어 있다는 것입니다.

기본 함수는 인코더에 대한 클래스 식별자 검색에 표시된 도우미 함수 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);

   EncoderParameters encoderParameters;
   ULONG             parameterValue;
   Status            stat;

   // An EncoderParameters object has an array of
   // EncoderParameter objects. In this case, there is only
   // one EncoderParameter object in the array.
   encoderParameters.Count = 1;

   // Initialize the one EncoderParameter object.
   encoderParameters.Parameter[0].Guid = EncoderSaveFlag;
   encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
   encoderParameters.Parameter[0].NumberOfValues = 1;
   encoderParameters.Parameter[0].Value = &parameterValue;

   // Get the CLSID of the TIFF encoder.
   CLSID encoderClsid;
   GetEncoderClsid(L"image/tiff", &encoderClsid);

   // Create four image objects.
   Image* multi = new Image(L"Shapes.bmp");
   Image* page2 = new Image(L"Cereal.gif");
   Image* page3 = new Image(L"Iron.jpg");
   Image* page4 = new Image(L"House.png");

   // Save the first page (frame).
   parameterValue = EncoderValueMultiFrame;
   stat = multi->Save(L"MultiFrame.tif", &encoderClsid, &encoderParameters);
   if(stat == Ok)
      printf("Page 1 saved successfully.\n");

   // Save the second page (frame).
   parameterValue = EncoderValueFrameDimensionPage;
   stat = multi->SaveAdd(page2, &encoderParameters);
   if(stat == Ok)
      printf("Page 2 saved successfully.\n");

   // Save the third page (frame).
   parameterValue = EncoderValueFrameDimensionPage;
   stat = multi->SaveAdd(page3, &encoderParameters);
   if(stat == Ok)
      printf("Page 3 saved successfully.\n");

   // Save the fourth page (frame).
   parameterValue = EncoderValueFrameDimensionPage;
   stat = multi->SaveAdd(page4, &encoderParameters);
   if(stat == Ok)
      printf("Page 4 saved successfully.\n");

   // Close the multiframe file.
   parameterValue = EncoderValueFlush;
   stat = multi->SaveAdd(&encoderParameters);
   if(stat == Ok)
      printf("File closed successfully.\n");

   delete multi;
   delete page2;
   delete page3;
   delete page4;
   GdiplusShutdown(gdiplusToken);
   return 0;
}