Condividi tramite


Creazione e salvataggio di un'immagine a più frame

Con determinati formati di file, è possibile salvare più immagini (fotogrammi) in un singolo file. Ad esempio, è possibile salvare diverse 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 di disco: Shapes.bmp, Cereal.gif, Iron.jpg e House.png. Il codice costruisce prima quattro oggetti Image: multi, page2, page3 e page4. In primo luogo, più contiene solo l'immagine da Shapes.bmp, ma alla fine contiene tutte e quattro le immagini. Man mano che le singole pagine vengono aggiunte all'oggetto MultiImage , vengono aggiunte anche al file multiframe.tif del disco.

Si noti che il codice chiama Salva (non SalvaAggiungi) 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à usato per convertire i dati nell'oggetto MultiImage nel formato (in questo caso TIFF) richiesto dal file del disco. Lo stesso codificatore viene usato automaticamente da tutte le chiamate successive al metodo SaveAdd dell'oggetto MultiImage .

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

Il codice salva la seconda, la terza e la quarta pagine chiamando il metodo SaveAdd dell'oggetto MultiImage . Il primo argomento passato al metodo SaveAdd è l'indirizzo di un oggetto Image . L'immagine nell'oggetto Image viene aggiunta all'oggetto Imagee viene aggiunta anche al file disco Multiframe.tif. Il secondo argomento passato al metodo SaveAdd è l'indirizzo dello stesso oggetto EncoderParameters utilizzato dal metodo Save . La differenza è che L'ULONG puntato dal membro Value contiene ora il valore EncoderValueFrameDimensionPage.

La funzione principale si basa sulla funzione helper GetEncoderClsid, visualizzata 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;
}