Erstellen und Speichern eines Bilds mit mehreren Frames

Bei bestimmten Dateiformaten können Sie mehrere Bilder (Frames) in einer einzelnen Datei speichern. Sie können beispielsweise mehrere Seiten in einer einzelnen TIFF-Datei speichern. Um die erste Seite zu speichern, rufen Sie die Save-Methode der Image-Klasse auf. Um nachfolgende Seiten zu speichern, rufen Sie die SaveAdd-Methode der Image-Klasse auf.

Hinweis

Sie können SaveAdd nicht verwenden, um einer animierten GIF-Datei Frames hinzuzufügen.

 

Die folgende Konsolenanwendung erstellt eine TIFF-Datei mit vier Seiten. Die Bilder, die zu den Seiten der TIFF-Datei werden, stammen aus vier Datenträgerdateien: Shapes.bmp, Cereal.gif, Iron.jpg und House.png. Der Code erstellt zunächst vier Image-Objekte : multi, page2, page3 und page4. Zunächst enthält multi nur das Bild aus Shapes.bmp, aber schließlich enthält es alle vier Bilder. Wenn die einzelnen Seiten dem Multi Image-Objekt hinzugefügt werden, werden sie auch der Datenträgerdatei Multiframe.tif hinzugefügt.

Beachten Sie, dass der Code Save (nicht SaveAdd) aufruft, um die erste Seite zu speichern. Das erste Argument, das an die Save-Methode übergeben wird, ist der Name der Datenträgerdatei, die schließlich mehrere Frames enthält. Das zweite Argument, das an die Save-Methode übergeben wird, gibt den Encoder an, der verwendet wird, um die Daten im MultiImage-Objekt in das format (in diesem Fall TIFF) zu konvertieren, das für die Datenträgerdatei erforderlich ist. Derselbe Encoder wird automatisch von allen nachfolgenden Aufrufen der SaveAdd-Methode des Multi Image-Objekts verwendet.

Das dritte Argument, das an die Save-Methode übergeben wird, ist die Adresse eines EncoderParameters-Objekts . Das EncoderParameters-Objekt verfügt über ein Array, das ein einzelnes EncoderParameter-Objekt enthält. Der Guid-Member dieses EncoderParameter-Objekts ist auf EncoderSaveFlag festgelegt. Der Value-Member des EncoderParameter-Objekts zeigt auf eine ULONG , die den Wert EncoderValueMultiFrame enthält.

Der Code speichert die zweite, dritte und vierte Seite, indem die SaveAdd-Methode des Multi Image-Objekts aufgerufen wird. Das erste Argument, das an die SaveAdd-Methode übergeben wird, ist die Adresse eines Image-Objekts . Das Bild in diesem Image-Objekt wird dem Multi Image-Objekt hinzugefügt und auch der Multiframe.tif-Datenträgerdatei hinzugefügt. Das zweite Argument, das an die SaveAdd-Methode übergeben wird, ist die Adresse desselben EncoderParameters-Objekts , das von der Save-Methode verwendet wurde. Der Unterschied besteht darin, dass die ULONG , auf die das Value-Element verweist, jetzt den Wert EncoderValueFrameDimensionPage enthält.

Die Standard-Funktion basiert auf der Hilfsfunktion GetEncoderClsid, die unter Abrufen des Klassenbezeichners für einen Encoder angezeigt wird.

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