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 = ¶meterValue;
// 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;
}