Membuat dan Menyimpan Gambar Multiple-Frame

Dengan format file tertentu, Anda dapat menyimpan beberapa gambar (bingkai) ke satu file. Misalnya, Anda dapat menyimpan beberapa halaman ke satu file TIFF. Untuk menyimpan halaman pertama, panggil metode Simpan dari kelas Gambar . Untuk menyimpan halaman berikutnya, panggil metode SimpanTambahkan dari kelas Gambar .

Catatan

Anda tidak dapat menggunakan SaveAdd untuk menambahkan bingkai ke file gif animasi.

 

Aplikasi konsol berikut membuat file TIFF dengan empat halaman. Gambar yang menjadi halaman file TIFF berasal dari empat file disk: Shapes.bmp, Cereal.gif, Iron.jpg, dan House.png. Kode pertama membangun empat objek Gambar : multi, page2, page3, dan page4. Pada awalnya, multi hanya berisi gambar dari Shapes.bmp, tetapi akhirnya berisi keempat gambar. Saat halaman individual ditambahkan ke objek multiGambar , halaman tersebut juga ditambahkan ke file disk Multiframe.tif.

Perhatikan bahwa kode memanggil Simpan (bukan SimpanTambahkan) untuk menyimpan halaman pertama. Argumen pertama yang diteruskan ke metode Simpan adalah nama file disk yang akhirnya akan berisi beberapa bingkai. Argumen kedua yang diteruskan ke metode Simpan menentukan encoder yang akan digunakan untuk mengonversi data dalam objek multiGambar ke format (dalam hal ini TIFF) yang diperlukan oleh file disk. Encoder yang sama digunakan secara otomatis oleh semua panggilan berikutnya ke metode SaveAdd dari objek multiImage .

Argumen ketiga yang diteruskan ke metode Simpan adalah alamat objek EncoderParameters . Objek EncoderParameters memiliki array yang berisi satu objek EncoderParameter . Anggota Guid dari objek EncoderParameter tersebut diatur ke EncoderSaveFlag. Anggota Nilai objek EncoderParameter menunjuk ke ULONG yang berisi nilai EncoderValueMultiFrame.

Kode menyimpan halaman kedua, ketiga, dan keempat dengan memanggil metode SimpanTambahkan objek multiGambar . Argumen pertama yang diteruskan ke metode SaveAdd adalah alamat objek Gambar . Gambar dalam objek Gambar ditambahkan ke objek multiGambar dan juga ditambahkan ke file disk Multiframe.tif. Argumen kedua yang diteruskan ke metode SaveAdd adalah alamat objek EncoderParameters yang sama yang digunakan oleh metode Simpan . Perbedaannya adalah bahwa ULONG yang diarahkan oleh anggota Nilai sekarang berisi nilai EncoderValueFrameDimensionPage.

Fungsi utama bergantung pada fungsi pembantu GetEncoderClsid, yang ditunjukkan dalam Mengambil Pengidentifikasi Kelas untuk 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;
}