Partager via


Création et enregistrement d’une image multiframe

Avec certains formats de fichier, vous pouvez enregistrer plusieurs images (images) dans un seul fichier. Par exemple, vous pouvez enregistrer plusieurs pages dans un seul fichier TIFF. Pour enregistrer la première page, appelez la méthode Save de la classe Image . Pour enregistrer les pages suivantes, appelez la méthode SaveAdd de la classe Image .

Notes

Vous ne pouvez pas utiliser SaveAdd pour ajouter des images à un fichier GIF animé.

 

L’application console suivante crée un fichier TIFF de quatre pages. Les images qui deviennent les pages du fichier TIFF proviennent de quatre fichiers disque : Shapes.bmp, Cereal.gif, Iron.jpg et House.png. Le code construit d’abord quatre objets Image : multi, page2, page3 et page4. Au début, multi contient uniquement l’image de Shapes.bmp, mais finalement, il contient les quatre images. Lorsque les pages individuelles sont ajoutées à l’objet MultiImage , elles sont également ajoutées au fichier disque Multiframe.tif.

Notez que le code appelle Save (et non SaveAdd) pour enregistrer la première page. Le premier argument passé à la méthode Save est le nom du fichier disque qui contiendra éventuellement plusieurs images. Le deuxième argument passé à la méthode Save spécifie l’encodeur qui sera utilisé pour convertir les données de l’objet MultiImage au format (dans ce cas TIFF) requis par le fichier disque. Ce même encodeur est utilisé automatiquement par tous les appels suivants à la méthode SaveAdd de l’objet MultiImage .

Le troisième argument passé à la méthode Save est l’adresse d’un objet EncoderParameters . L’objet EncoderParameters a un tableau qui contient un seul objet EncoderParameter. Le membre GUID de cet objet EncoderParameter est défini sur EncoderSaveFlag. Le membre Value de l’objet EncoderParameter pointe vers un ULONG qui contient la valeur EncoderValueMultiFrame.

Le code enregistre les deuxième, troisième et quatrième pages en appelant la méthode SaveAdd de l’objet MultiImage . Le premier argument passé à la méthode SaveAdd est l’adresse d’un objet Image . L’image de cet objet Image est ajoutée à l’objet MultiImage et est également ajoutée au fichier disque Multiframe.tif. Le deuxième argument passé à la méthode SaveAdd est l’adresse du même objet EncoderParameters utilisé par la méthode Save . La différence est que le ULONG pointé vers par le membre Value contient désormais la valeur EncoderValueFrameDimensionPage.

La fonction main s’appuie sur la fonction d’assistance GetEncoderClsid, qui est illustrée dans Récupération de l’identificateur de classe pour un encodeur.

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