Delen via


Een Multiple-Frame-image creëren en opslaan

Met bepaalde bestandsindelingen kunt u meerdere afbeeldingen (frames) opslaan in één bestand. U kunt bijvoorbeeld meerdere pagina's opslaan in één TIFF-bestand. Als u de eerste pagina wilt opslaan, roept u de methode Save van de Image-klasse aan. Als u volgende pagina's wilt opslaan, roept u de methode SaveAdd van de klasse Image aan.

Notitie

U kunt SaveAdd- niet gebruiken om frames toe te voegen aan een GIF-bestand met animaties.

 

De volgende consoletoepassing maakt een TIFF-bestand met vier pagina's. De afbeeldingen die de pagina's van het TIFF-bestand worden, zijn afkomstig van vier schijfbestanden: Shapes.bmp, Cereal.gif, Iron.jpgen House.png. Met de code worden eerst vier Afbeelding objecten gemaakt: multi, pagina2, pagina3, en pagina4. In eerste instantie bevat multi- alleen de afbeelding uit Shapes.bmp, maar uiteindelijk bevat het alle vier de afbeeldingen. Omdat de afzonderlijke pagina's worden toegevoegd aan het multiImage-object, worden ze ook toegevoegd aan het schijfbestand Multiframe.tif.

Houd er rekening mee dat de code Opslaan aanroept (niet SaveAdd) om de eerste pagina op te slaan. Het eerste argument dat wordt doorgegeven aan de methode Opslaan, is de naam van het schijfbestand dat uiteindelijk meerdere frames bevat. Het tweede argument dat wordt doorgegeven aan de methode Opslaan, geeft de encoder op die wordt gebruikt om de gegevens in de multi-Image-object te converteren naar de indeling (in dit geval TIFF) die is vereist voor het schijfbestand. Dezelfde encoder wordt automatisch gebruikt bij alle volgende aanroepen van de methode SaveAdd van het multi-Image-object.

Het derde argument dat wordt doorgegeven aan de methode Opslaan is het adres van een EncoderParameters--object. Het object EncoderParameters heeft een matrix met één EncoderParameter-object. Het Guid-lid van dat EncoderParameter-object is ingesteld op EncoderSaveFlag. De waarde lid van het EncoderParameter object verwijst naar een ULONG die de waarde EncoderValueMultiFrame bevat.

De code slaat de tweede, derde en vierde pagina op door de methode SaveAdd van het multi-Image-object aan te roepen. Het eerste argument dat is doorgegeven aan de methode SaveAdd, is het adres van een Image-object. De afbeelding in dat object Image wordt toegevoegd aan het multiImage-object en wordt ook toegevoegd aan het multiframe.tif schijfbestand. Het tweede argument dat is doorgegeven aan de methode SaveAdd, is het adres van hetzelfde EncoderParameters-object dat is gebruikt door de methode Opslaan. Het verschil is dat de ULONG waarnaar wordt verwezen door het Value element nu de waarde EncoderValueFrameDimensionPage bevat.

De hoofdfunctie is afhankelijk van de helperfunctie GetEncoderClsid, die wordt weergegeven in De klasse-id ophalen voor een encoder.

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