Condividi tramite


Creazione e salvataggio di un'immagine Multiple-Frame

Con determinati formati di file, è possibile salvare più immagini (fotogrammi) in un singolo file. Ad esempio, è possibile salvare più pagine in un singolo file TIFF. Per salvare la prima pagina, chiamare il metodo Save della classe Image. Per salvare le pagine successive, chiamare il metodo SaveAdd della classe Image.

Nota

Non è possibile usare SaveAdd per aggiungere fotogrammi a un file gif animato.

 

L'applicazione console seguente crea un file TIFF con quattro pagine. Le immagini che diventano le pagine del file TIFF provengono da quattro file su disco: Shapes.bmp, Cereal.gif, Iron.jpge House.png. Il codice innanzitutto costruisce quattro oggetti Image: multi, page2, page3e page4. All'inizio, più contiene solo l'immagine di Shapes.bmp, ma infine contiene tutte e quattro le immagini. Man mano che le singole pagine vengono aggiunte all'oggetto multi immagine, vengono aggiunte anche nel file Multiframe.tif.

Si noti che il codice chiama Salva (non SaveAdd) per salvare la prima pagina. Il primo argomento passato al metodo Save è il nome del file del disco che conterrà infine diversi fotogrammi. Il secondo argomento passato al metodo Save specifica il codificatore che verrà utilizzato per convertire i dati nell'oggetto Image nel formato (in questo caso TIFF) richiesto dal file su disco. Lo stesso codificatore viene usato automaticamente da tutte le chiamate successive al metodo SaveAdd dell'oggetto Image.

Il terzo argomento passato al metodo Save è l'indirizzo di un oggetto EncoderParameters. L'oggetto EncoderParameters include una matrice che contiene un singolo oggetto EncoderParameter. Il membro guid di tale oggetto EncoderParameter è impostato su EncoderSaveFlag. Il membro Value dell'oggetto EncoderParameter punta a un ULONG che contiene il valore EncoderValueMultiFrame.

Il codice salva la seconda, la terza e la quarta pagina chiamando il metodo SaveAdd dell'oggettoimage multi. Il primo argomento passato al metodo SaveAdd è l'indirizzo di un oggetto Image. L'immagine in tale oggetto Immagine viene aggiunta all'oggetto Immagine multipla e viene anche aggiunta al file su disco Multiframe.tif. Il secondo argomento passato al metodo SaveAdd è l'indirizzo dello stesso EncoderParameters oggetto utilizzato dal metodo Save. La differenza è che il ULONG a cui punta il membro Value contiene ora il valore EncoderValueFrameDimensionPage.

La funzione principale si basa sulla funzione helper GetEncoderClsid, illustrata in Recupero dell'identificatore di classe per un codificatore.

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