Bagikan melalui


Menerapkan IWICMetadataBlockReader

IWICMetadataBlockReader

Beberapa blok metadata sering ada dalam gambar, masing-masing mengekspos berbagai jenis informasi dalam format yang berbeda. Dalam model Windows Imaging Component (WIC), handler metadata adalah komponen berbeda yang, seperti decoder, dapat ditemukan pada waktu proses. 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 handler 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.

Nota

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 handler IFD untuk kedua format kontainer ini yang menavigasi struktur IFD dan mendelegasikan ke handler 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 eksklusif yang memiliki struktur metadata tingkat atas yang unik sendiri, Anda harus menulis handler yang dapat menavigasi struktur tingkat atas tersebut dan mendelegasikan ke handler metadata yang sesuai, seperti yang dilakukan handler IFD.)

 

Dengan cara yang sama WIC menyediakan lapisan abstraksi untuk aplikasi yang memungkinkan mereka 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 menerapkan 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.

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 Menerapkan 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 saat Anda mengembalikannya dalam parameter ppIEnumMetadata.

Saat menerapkan objek enumerasi, Anda dapat membuat semua pembaca metadata ketika pertama kali membuat objek IWICMetadataBlockReader, atau ketika Anda membuat objek enumerasi, atau Anda dapat membuatnya secara bertahap 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 mengembangkan handler metadata, dan Anda ingin menggunakan milik Anda sendiri jika tersedia, 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 memiliki pembaca metadata yang terinstal 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 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 susunan kontainer Anda. Little-endian adalah tata letak yang digunakan secara default.

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

WICMetadataCreationOptions menentukan apakah Anda ingin mendapatkan kembali UnknownMetadataHandler jika tidak ada pembaca metadata yang ditemukan di komputer yang dapat membaca format metadata dari blok tertentu. WICMetadataCreationAllowUnknown adalah default, dan Anda harus selalu mengizinkan pembuatan UnknownMetadtataHandler. UnknownMetadataHandler memperlakukan metadata yang tidak dikenali sebagai BLOB. Sistem ini tidak dapat mengurainya, tetapi menuliskannya ke stream sebagai BLOB, dan mempertahankannya tetap utuh saat ditulis kembali ke stream selama proses encoding. Ini membuatnya aman untuk membuat pengolah metadata untuk metadata proprietari atau format metadata yang tidak disertakan dengan sistem. Karena metadata dipertahankan secara utuh, bahkan jika tidak ada handler yang ada 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.

Nota

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 valid lagi ketika ini terjadi.

 

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

Parameter pIStream adalah stream yang sebenarnya sedang Anda dekode. Sebelum memproses aliran data, Anda harus mencari ke awal blok metadata tempat Anda meminta pembaca. Pembaca metadata yang sesuai untuk blok metadata di posisi saat ini di IStream akan dikembalikan dalam parameter ppiReader.

DapatkanPembacaBerdasarkanIndeks

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