Menerapkan IWICMetadataBlockReader

IWICMetadataBlockReader

Beberapa blok metadata sering ada dalam gambar, masing-masing mengekspos berbagai jenis informasi dalam format yang berbeda. Dalam model Komponen Pencitraan Windows (WIC), penangan metadata adalah komponen berbeda yang, seperti dekode, dapat ditemukan pada durasi. Setiap format metadata memiliki handler terpisah, dan masing-masing handler metadata ini dapat digunakan dengan format gambar apa pun yang mendukung format metadata yang ditanganinya. Oleh karena itu, jika format gambar Anda mendukung EXIF, XMP, IPTC, atau format lain, Anda dapat memanfaatkan penangan metadata standar untuk format ini yang dikirim dengan WIC, dan Anda tidak perlu menulis sendiri. Tentu saja, jika Anda membuat format metadata baru, Anda harus menulis handler metadata untuk itu, yang akan ditemukan dan dipanggil pada run time sama seperti yang standar.

Catatan

Jika format gambar Anda didasarkan pada kontainer Format File Gambar Bertag (TIFF) atau JPEG, Anda tidak perlu menulis penangan metadata apa pun (kecuali Anda mengembangkan format metadata baru atau kepemilikan). Dalam kontainer TIFF dan JPEG, blok metadata terletak dalam IFD, dan setiap kontainer memiliki struktur IFD yang berbeda. WIC menyediakan penangan IFD untuk kedua format kontainer ini yang menavigasi struktur IFD dan mendelegasikan ke penangan metadata standar untuk mengakses metadata di dalamnya. Jadi, jika format gambar Anda didasarkan pada salah satu kontainer ini, Anda dapat secara otomatis memanfaatkan handler WIC IFD. Namun, jika Anda memiliki format kontainer kepemilikan yang memiliki struktur metadata tingkat atas yang unik sendiri, Anda harus menulis handler yang dapat menavigasi struktur tingkat atas tersebut dan mendelegasikan ke penangan metadata yang sesuai, seperti yang dilakukan handler IFD.)

 

Dengan cara yang sama WIC menyediakan lapisan abstraksi untuk aplikasi yang memungkinkan mereka untuk bekerja dengan semua format gambar dengan cara yang sama melalui serangkaian antarmuka yang konsisten, WIC menyediakan lapisan abstraksi untuk penulis codec sehubungan dengan format metadata. Seperti disebutkan sebelumnya, penulis codec umumnya tidak perlu bekerja langsung dengan berbagai format metadata yang mungkin ada dalam gambar. Namun, setiap penulis codec bertanggung jawab untuk menyediakan cara untuk menghitung blok metadata sehingga handler metadata yang sesuai dapat ditemukan dan dibuat untuk setiap blok.

Anda harus mengimplementasikan antarmuka ini pada kelas decoding tingkat bingkai Anda. Anda mungkin juga perlu mengimplementasikannya pada kelas dekoder tingkat kontainer jika format gambar Anda mengekspos metadata global di luar bingkai gambar individual apa pun.

interface IWICMetadataBlockReader : IUnknown
{
   // All methods required
   HRESULT GetContainerFormat ( GUID *pguidContainerFormat );
   HRESULT GetCount ( UINT *pcCount );
   HRESULT GetEnumerator ( IEnumUnknown **ppIEnumMetadata );
   HRESULT GetReaderByIndex ( UINT nIndex, IWICMetadataReader **ppIMetadataReader );
}

GetContainerFormat

GetContainerFormat sama dengan metode GetContainerFormat pada Mengimplementasikan IWICBitmapDecoder.

GetCount

GetCount mengembalikan jumlah blok metadata tingkat atas yang terkait dengan bingkai.

GetEnumerator

GetEnumerator mengembalikan enumerator yang dapat digunakan pemanggil untuk menghitung blok metadata dalam bingkai dan membaca metadatanya. Untuk menerapkan metode ini, Anda perlu membuat pembaca metadata untuk setiap blok metadata, dan menerapkan objek enumerasi yang menghitung pengumpulan pembaca metadata. Objek enumerasi harus mengimplementasikan IEnumUnknown sehingga Anda dapat mentransmisikannya ke IEnumUnknown ketika Anda mengembalikannya dalam parameter ppIEnumMetadata .

Saat menerapkan objek enumerasi, Anda dapat membuat semua pembaca metadata saat pertama kali membuat objek IWICMetadataBlockReader atau ketika Anda pertama kali membuat objek enumerasi, atau Anda dapat membuatnya dengan malas di dalam implementasi metode IEnumUnknown::Next . Dalam banyak kasus, lebih efisien untuk membuatnya dengan malas tetapi, dalam contoh berikut, pembaca blok semuanya dibuat di konstruktor untuk menghemat ruang.

public class MetadataReaderEnumerator : public IEnumUnknown
{
   UINT m_current;
   UINT m_blockCount;
   IWICMetadataReader** m_ppMetadataReader;
   IStream* m_pStream;

   MetadataReaderEnumerator() 
   {
       // Set m_blockCount to the number of metadata blocks in the frame. 
      ...
      m_ppMetadataReader = IWICMetadataReader*[m_blockCount];
       m_current = 0;

      for (UINT x=0; x < m_blockCount; x++) 
      {
         // Find the position in the file where the xth
         // block of metadata lives and seek m_piStream 
         // to that position.
         ...

         m_pComponentFactory->CreateMetadataReaderFromContainer(
            GUID_ContainerFormatTiff,
                        NULL,
                        WICPersistOptions.WICPersistOptionsDefault | 
            WICMetadataCreationOptions.WICMetadataCreationDefault, 
                        m_pStream, &m_ppMetadataReader[x]);
        }
    }

    // Implementation of IEnumUnknown and IUnknown interfaces
    ...
}

Untuk membuat pembaca metadata, Anda menggunakan metode CreateMetadataReaderFromContainer . Saat memanggil metode ini, Anda meneruskan GUID format kontainer dalam parameter guidContainerFormat . Jika Anda memiliki preferensi vendor untuk pembaca metadata, Anda dapat meneruskan GUID vendor pilihan Anda di parameter pGuidVendor . Misalnya, jika perusahaan Anda menulis penangan metadata, dan Anda ingin menggunakan sendiri jika ada, Anda dapat meneruskan GUID vendor Anda. Dalam kebanyakan kasus, Anda hanya akan meneruskan NULL, dan membiarkan sistem memilih pembaca metadata yang sesuai. Jika Anda meminta vendor tertentu, dan vendor tersebut memang memiliki pembaca metadata yang diinstal di komputer, WIC akan mengembalikan pembaca vendor tersebut. Namun, jika vendor yang diminta tidak memiliki pembaca metadata yang diinstal di komputer, dan jika ada pembaca metadata yang sesuai yang tersedia, pembaca tersebut akan dikembalikan meskipun bukan dari vendor pilihan. Jika tidak ada pembaca metadata di komputer untuk jenis metadata di blok, pabrik komponen akan mengembalikan Handler Metadata Yang Tidak Diketahui, yang akan memperlakukan blok metadata sebagai objek besar biner (BLOB), dan akan mendeserialisasi blok metadata dari file tanpa upaya mengurainya.

Untuk parameter dwOptions , lakukan operasi OR antara WICPersistOptions yang sesuai dengan WICMetadataCreationOptions yang sesuai. WICPersistOptions menjelaskan bagaimana kontainer Anda ditata. Little-endian adalah default.

enum WICPersistOptions
{   
   WICPersistOptionDefault,
   WICPersistOptionLittleEndian,
   WICPersistOptionBigEndian,
   WICPersistOptionStrictFormat,
   WICPersistOptionNoCacheStream,
   WICPersistOptionPreferUTF8
};

WICMetadataCreationOptions menentukan apakah Anda ingin mendapatkan kembali UnknownMetadataHandler jika tidak ada pembaca metadata yang ditemukan pada komputer yang dapat membaca format metadata blok tertentu. WICMetadataCreationAllowUnknown adalah default, dan Anda harus selalu mengizinkan pembuatan UnknownMetadtaHandler. UnknownMetadataHandler memperlakukan metadata yang tidak dikenali sebagai BLOB. Ini tidak dapat mengurainya, tetapi menulisnya ke aliran sebagai BLOB, dan tetap utuh ketika ditulis kembali ke aliran selama pengodean. Ini membuatnya aman untuk membuat penangan metadata untuk metadata kepemilikan atau format metadata yang tidak dikirim dengan sistem. Karena metadata dipertahankan secara utuh, bahkan jika tidak ada handler di komputer yang mengenalinya, ketika handler metadata yang sesuai nanti diinstal, metadata akan tetap ada dan dapat dibaca. Jika Anda tidak mengizinkan pembuatan UnknownMetadataHandler, alternatifnya adalah membuang atau menimpa metadata yang tidak dikenali. Ini adalah bentuk kehilangan data.

Catatan

Jika Anda menulis handler metadata Anda sendiri untuk metadata kepemilikan, Anda tidak boleh menyertakan referensi ke apa pun di luar blok metadata itu sendiri. Meskipun UnknownMetadataHandler mempertahankan metadata secara utuh, metadata memang dipindahkan ketika file diedit, dan referensi apa pun ke apa pun di luar bloknya sendiri tidak akan lagi valid ketika ini terjadi.

 

enum WICMetadataCreationOptions
{
   WICMetadataCreationDefault = 0x00000000,
   WICMetadataCreationAllowUnknown = WICMetadataCreationDefault,
   WICMetadataCreationFailUnknown = 0x00010000,
   WICMetadataCreationMask = 0xFFFF0000
};

Parameter pIStream adalah aliran aktual yang Anda pendekodekan. Sebelum melewati aliran, Anda harus mencari ke awal blok metadata tempat Anda meminta pembaca. Pembaca metadata yang sesuai untuk blok metadata pada posisi saat ini di IStream akan dikembalikan dalam parameter ppiReader .

GetReaderByIndex

GetReaderByIndex mengembalikan pembaca metadata pada indeks yang diminta dalam koleksi.

Referensi

IWICMetadataBlockReader

Konseptual

Menerapkan IWICBitmapFrameDecode

Menerapkan IWICBitmapSourceTransform

Cara Menulis WIC-Enabled CODEC

Gambaran Umum Komponen Pencitraan Windows