Поделиться через


Создание и сохранение образа Multiple-Frame

С определенными форматами файлов можно сохранить несколько изображений (кадров) в один файл. Например, можно сохранить несколько страниц в одном TIFF-файле. Чтобы сохранить первую страницу, вызовите метод Save класса Image. Чтобы сохранить последующие страницы, вызовите метод SaveAdd класса Image.

Заметка

Нельзя использовать SaveAdd для добавления кадров в анимированный GIF-файл.

 

В следующем консольном приложении создается TIFF-файл с четырьмя страницами. Изображения, которые становятся страницами TIFF-файла, приходят из четырех дисковых файлов: Shapes.bmp, Cereal.gif, Iron.jpgи House.png. Код сначала создает четыре объекта Image: multi, page2, page3и page4. Сначала мульти содержит только изображение из Shapes.bmp, но в конечном итоге включает все четыре изображения. Когда отдельные страницы добавляются в объект с несколькимиизображениями, они также добавляются в файл на диске Multiframe.tif.

Обратите внимание, что код вызывает Save (а не SaveAdd) для сохранения первой страницы. Первый аргумент, переданный методу Save, — это имя файла диска, который в конечном итоге будет содержать несколько кадров. Второй аргумент, передаваемый методу Save, определяет кодировщик, который будет использоваться для преобразования данных из объекта Imageв формат, необходимый для файла на диске (в данном случае TIFF). Этот же кодировщик используется автоматически всеми последующими вызовами метода SaveAdd объекта multiImage.

Третий аргумент, переданный методу Save, — это адрес объекта EncoderParameters. Объект EncoderParameters содержит массив, содержащий один объект EncoderParameter. Для элемента GUID в объекте EncoderParameter задано значение EncoderSaveFlag. Элемент Value объекта EncoderParameter указывает на ULONG, содержащий значение EncoderValueMultiFrame.

Код сохраняет второй, третий и четвёртый страницы через вызов метода SaveAdd объекта multiImage. Первым аргументом, переданным методу SaveAdd, является адрес объекта image. Изображение в объекте Image добавляется в объект многоизображение и также добавляется в файл на диске Multiframe.tif. Второй аргумент, переданный методу SaveAdd, — это адрес того же объекта EncoderParameters, который использовался методом Save. Разница заключается в том, что ULONG, на который указывает член Value, теперь содержит значение 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;
}