Criar e salvar uma imagem de vários quadros
Com determinados formatos de arquivo, você pode salvar várias imagens (quadros) em um único arquivo. Por exemplo, você pode salvar várias páginas em um único arquivo TIFF. Para salvar a primeira página, chame o método Save da classe Image . Para salvar páginas subsequentes, chame o método SaveAdd da classe Image .
Observação
Não é possível usar SaveAdd para adicionar quadros a um arquivo gif animado.
O aplicativo de console a seguir cria um arquivo TIFF com quatro páginas. As imagens que se tornam páginas do arquivo TIFF vêm de quatro arquivos de disco: Shapes.bmp, Cereal.gif, Iron.jpg e House.png. O código primeiro constrói quatro objetos Image : multi, page2, page3 e page4. No início, o multi contém apenas a imagem de Shapes.bmp, mas, eventualmente, contém todas as quatro imagens. À medida que as páginas individuais são adicionadas ao objeto multiImage , elas também são adicionadas ao arquivo de disco Multiframe.tif.
Observe que o código chama Salvar (não SaveAdd) para salvar a primeira página. O primeiro argumento passado para o método Save é o nome do arquivo de disco que eventualmente conterá vários quadros. O segundo argumento passado para o método Save especifica o codificador que será usado para converter os dados no objeto multiImage para o formato (neste caso, TIFF) exigido pelo arquivo de disco. Esse mesmo codificador é usado automaticamente por todas as chamadas subsequentes para o método SaveAdd do objeto multiImage .
O terceiro argumento passado para o método Save é o endereço de um objeto EncoderParameters . O objeto EncoderParameters tem uma matriz que contém um único objeto EncoderParameter . O membro Guid desse objeto EncoderParameter é definido como EncoderSaveFlag. O membro Value do objeto EncoderParameter aponta para um ULONG que contém o valor EncoderValueMultiFrame.
O código salva a segunda, terceira e quarta páginas chamando o método SaveAdd do objeto multiImage . O primeiro argumento passado para o método SaveAdd é o endereço de um objeto Image . A imagem nesse objeto Image é adicionada ao objeto multiImage e também é adicionada ao arquivo de disco Multiframe.tif. O segundo argumento passado para o método SaveAdd é o endereço do mesmo objeto EncoderParameters que foi usado pelo método Save . A diferença é que o ULONG apontado pelo membro Value agora contém o valor EncoderValueFrameDimensionPage.
A função main depende da função auxiliar GetEncoderClsid, que é mostrada em Recuperando o Identificador de Classe para um Codificador.
#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;
}