Bagikan melalui


Gambaran Umum Ekstensibilitas Metadata

Topik ini memperkenalkan persyaratan untuk membuat penangan metadata kustom untuk Komponen Pencitraan Windows (WIC), termasuk pembaca metadata dan penulis. Ini juga membahas persyaratan untuk memperluas penemuan komponen run-time WIC untuk menyertakan penangan metadata kustom Anda.

Topik ini berisi bagian berikut.

Prasyarat

Untuk memahami topik ini, Anda harus memiliki pemahaman mendalam tentang WIC, komponennya, dan metadata untuk gambar. Untuk informasi selengkapnya tentang metadata WIC, lihat Gambaran Umum Metadata WIC . Untuk informasi selengkapnya tentang komponen WIC, lihat Gambaran Umum Komponen Pencitraan Windows .

Perkenalan

Seperti yang dibahas dalam Gambaran Umum Metadata WIC, sering ada beberapa blok metadata dalam gambar, masing-masing mengekspos berbagai jenis informasi dalam format metadata yang berbeda. Untuk berinteraksi dengan format metadata yang disematkan dalam gambar, aplikasi harus menggunakan penangan metadata yang sesuai. WIC menyediakan beberapa penangan metadata (pembaca metadata dan penulis) yang memungkinkan Anda membaca dan menulis jenis metadata tertentu seperti Exif atau XMP.

Selain handler asli yang disediakan, WIC menyediakan API yang memungkinkan Anda membuat handler metadata baru yang berpartisipasi dalam penemuan komponen run-time WIC. Ini memungkinkan aplikasi yang menggunakan WIC untuk membaca dan menulis format metadata kustom Anda.

Langkah-langkah berikut memungkinkan penanganan metadata Anda untuk berpartisipasi dalam penemuan metadata run-time WIC.

  • Terapkan kelas handler metadata-reader (IWICMetadataReader) yang mengekspos antarmuka WIC yang diperlukan untuk membaca format metadata kustom Anda. Ini memungkinkan aplikasi berbasis WIC untuk membaca format metadata Anda dengan cara yang sama seperti mereka membaca format metadata asli.
  • Terapkan kelas handler metadata-writer (IWICMetadataWriter) yang mengekspos antarmuka WIC yang diperlukan untuk mengodekan format metadata kustom Anda. Ini memungkinkan aplikasi berbasis WIC untuk menserialisasikan format metadata Anda ke dalam format gambar yang didukung.
  • Tanda tangani dan daftarkan penangan metadata Anda secara digital. Ini memungkinkan penangan metadata Anda ditemukan pada waktu proses dengan mencocokkan pola identifikasi dalam registri dengan pola yang disematkan dalam file gambar.

Membuat Pembaca Metadata

Akses utama ke blok metadata dalam codec adalah melalui antarmuka IWICMetadataBlockReader yang diterapkan setiap codec WIC. Antarmuka ini menghitung setiap blok metadata yang disematkan dalam format gambar sehingga handler metadata yang sesuai dapat ditemukan dan dibuat untuk setiap blok. Blok metadata yang tidak dikenali oleh WIC dianggap tidak diketahui dan didefinisikan sebagai CLSID_WICUnknownMetadataReader GUID. Agar format metadata Anda dikenali oleh WIC, Anda harus membuat kelas yang mengimplementasikan tiga antarmuka: IWICMetadataReader, IWICPersistStream, dan IWICStreamProvider.

Nota

Jika format metadata Anda memiliki batasan yang membuat beberapa metode antarmuka yang diperlukan menjadi tidak sesuai, metode tersebut harus mengembalikan WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Antarmuka IWICMetadataReader

AntarmukaIWICMetadataReaderharus diimplementasikan saat membuat pembaca metadata. Antarmuka ini menyediakan akses ke item metadata yang mendasar dalam aliran data format metadata.

Kode berikut menunjukkan definisi antarmuka pembaca metadata seperti yang didefinisikan dalam file wincodecsdk.idl.

interface IWICMetadataReader : IUnknown
{
    HRESULT GetMetadataFormat(
        [out] GUID *pguidMetadataFormat
        );

    HRESULT GetMetadataHandlerInfo(
        [out] IWICMetadataHandlerInfo **ppIHandler
        );

    HRESULT GetCount(
        [out] UINT *pcCount
        );

    HRESULT GetValueByIndex(
        [in] UINT nIndex,
        [in, out, unique] PROPVARIANT *pvarSchema,
        [in, out, unique] PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetEnumerator(
        [out] IWICEnumMetadataItem **ppIEnumMetadata
        );
};

Metode GetMetadataFormat mengembalikan GUID format metadata Anda.

Metode GetMetadataHandlerInfo mengembalikan antarmuka IWICMetadataHandlerInfo yang menyediakan informasi tentang handler metadata Anda. Ini termasuk informasi seperti format gambar apa yang mendukung format metadata dan apakah pembaca metadata Anda memerlukan akses ke aliran metadata lengkap.

Metode GetCount mengembalikan jumlah item metadata individual (termasuk blok metadata yang disematkan) yang ditemukan dalam aliran metadata.

Metode GetValueByIndex mengembalikan item metadata dengan nilai indeks. Metode ini memungkinkan aplikasi untuk mengulang setiap item metadata dalam blok metadata. Kode berikut menunjukkan bagaimana aplikasi dapat menggunakan metode ini untuk mengambil setiap item metadata dalam blok metadata.

PROPVARIANT readerValue;
IWICMetadataBlockReader *blockReader = NULL;
IWICMetadataReader *reader = NULL;

PropVariantInit(&readerValue);

hr = pFrameDecode->QueryInterface(IID_IWICMetadataBlockReader, (void**)&blockReader);

if (SUCCEEDED(hr))
{
    // Retrieve the third block in the image. This is image specific and
    // ideally you should call this by retrieving the reader count
    // first.
    hr = blockReader->GetReaderByIndex(2, &reader);
}

if (SUCCEEDED(hr))
{
    UINT numValues = 0;

    hr = reader->GetCount(&numValues);

    // Loop through each item and retrieve by index
    for (UINT i = 0; SUCCEEDED(hr) && i < numValues; i++)
    {
        PROPVARIANT id, value;

        PropVariantInit(&id);
        PropVariantInit(&value);

        hr = reader->GetValueByIndex(i, NULL, &id, &value);

        if (SUCCEEDED(hr))
        {
            // Do something with the metadata item.
            //...
        }
        PropVariantClear(&id);
        PropVariantClear(&value);
    }               
}

Metode GetValue mengambil item metadata tertentu berdasarkan skema dan/atau ID. Metode ini mirip dengan metode GetValueByIndex kecuali mengambil item metadata yang memiliki skema atau ID tertentu.

Metode GetEnumerator mengembalikan enumerator dari setiap item metadata di blok metadata. Ini memungkinkan aplikasi menggunakan enumerator untuk menavigasi format metadata Anda.

Jika format metadata Anda tidak memiliki gagasan skema untuk item metadata, GetValue... metode harus mengabaikan properti ini. Namun, jika format Anda mendukung penamaan skema, Anda harus mengantisipasi nilai NULL.

Jika item metadata adalah blok metadata yang disematkan, buat handler metadata dari substream konten yang disematkan dan kembalikan handler metadata baru. Jika tidak ada pembaca metadata yang tersedia untuk blok berlapis, buat instans dan kembalikan pembaca metadata yang tidak diketahui. Untuk membuat pembaca metadata baru untuk blok yang disematkan, panggil metode CreateMetadataReaderFromContainer atau CreateMetadataReader, atau panggil fungsi WICMatchMetadataContent.

Jika aliran metadata berisi konten big-endian, pembaca metadata bertanggung jawab untuk mengubah nilai data apa pun yang diprosesnya. Ini juga bertanggung jawab untuk menginformasikan pembaca metadata berlapis bahwa mereka bekerja dengan aliran data big-endian. Namun, semua nilai harus dikembalikan dalam format little-endian.

Terapkan dukungan untuk navigasi namespace dengan mendukung kueri di mana ID item metadata adalah VT_CLSID (GUID) yang sesuai dengan format metadata. Jika pembaca metadata berlapis untuk format tersebut diidentifikasi selama penguraian, itu harus dikembalikan. Ini memungkinkan aplikasi menggunakan pembaca kueri metadata untuk mencari format metadata Anda.

Saat mendapatkan item metadata menurut ID, Anda harus menggunakan Fungsi PropVariantChangeType untuk mengubah ID ke dalam jenis yang diharapkan. Misalnya, pembaca IFD akan mengubah ID ke tipe VT_UI2 agar sesuai dengan tipe data tag ID IFD USHORT. Jenis data input dan jenis data yang diharapkan harus PROPVARIANT untuk melakukan ini. Ini tidak diperlukan, tetapi melakukan paksaan ini menyederhanakan kode yang memanggil pembaca untuk mengkueri item metadata.

Antarmuka IWICPersistStream

Antarmuka IWICPersistStream mewarisi dari IPersistStream dan menyediakan metode tambahan untuk menyimpan dan memuat objek dengan menggunakan enumerasi WICPersistOptions.

Kode berikut menunjukkan definisi antarmukaIWICPersistStream seperti yang didefinisikan dalam file wincodecsdk.idl.

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

Metode LoadEx menyediakan pembaca metadata Anda dengan aliran data yang berisi blok metadata Anda. Pembaca Anda mengurai aliran ini untuk mengakses item metadata yang mendasar. Pembaca metadata Anda diinisialisasi dengan subaliran yang diposisikan di posisi awal konten metadata mentah. Jika pembaca Anda tidak memerlukan aliran penuh, substream dibatasi dalam rentang hanya untuk konten blok metadata; jika tidak, aliran metadata lengkap disediakan dengan posisi yang ditetapkan di awal blok metadata Anda.

Metode SaveEx digunakan oleh penulis metadata untuk menserialisasikan blok metadata Anda. Saat SaveEx digunakan dalam pembaca metadata, seharusnya mengembalikan WINCODEC_ERR_UNSUPPORTEDOPERATION.

Antarmuka IWICStreamProvider

AntarmukaIWICStreamProvidermemungkinkan pembaca metadata Anda untuk memberikan referensi ke aliran kontennya, memberikan informasi tentang aliran, dan menyegarkan versi aliran yang di-cache.

Kode berikut menunjukkan definisi antarmuka IWICStreamProvider seperti yang didefinisikan dalam file wincodecsdk.idl.

interface IWICStreamProvider : IUnknown
{
    HRESULT GetStream(
        [out] IStream **ppIStream
        );

    HRESULT GetPersistOptions(
        [out] DWORD *pdwPersistOptions
        );

    HRESULT GetPreferredVendorGUID(
        [out] GUID *pguidPreferredVendor
        );

    HRESULT RefreshStream(
        );
};

Metode GetStream mengambil rujukan ke aliran metadata Anda. Aliran yang Anda kembalikan harus mengatur ulang penunjuk aliran ke posisi mulai. Jika format metadata Anda memerlukan akses streaming penuh, posisi mulai harus menjadi awal blok metadata Anda.

Metode GetPersistOptions mengembalikan opsi streaming saat ini dari enumerasiWICPersistOptions.

Metode GetPreferredVendorGUID mengembalikan GUID dari vendor dari pembaca metadata.

Metode RefreshStream menyegarkan aliran metadata. Metode ini harus memanggil LoadEx dengan aliran NULL untuk blok metadata berlapis apa pun. Ini diperlukan karena blok metadata berlapis dan itemnya mungkin tidak ada lagi, karena pengeditan di tempat.

Membuat Penulis Metadata

Penulis metadata adalah jenis penangan metadata yang menyediakan cara untuk menserialisasikan blok metadata ke bingkai gambar, atau di luar bingkai individual jika format gambar mendukungnya. Akses utama ke penulis metadata dalam codec adalah melalui antarmukaIWICMetadataBlockWriter yang diterapkan setiap encoder WIC. Antarmuka ini memungkinkan aplikasi untuk menghitung setiap blok metadata yang disematkan dalam gambar sehingga penulis metadata yang sesuai dapat ditemukan dan dibuat untuk setiap blok metadata. Blok metadata yang tidak memiliki penulis metadata yang sesuai dianggap tidak diketahui, dan didefinisikan sebagai GUID CLSID_WICUnknownMetadataReader. Untuk mengaktifkan aplikasi yang diaktifkan WIC untuk membuat serialisasi dan menulis format metadata Anda, Anda harus membuat kelas yang mengimplementasikan antarmuka berikut: IWICMetadataWriter, IWICMetadataReader, IWICPersistStream, dan IWICStreamProvider.

Nota

Jika format metadata Anda memiliki batasan yang membuat beberapa metode dari antarmuka yang diperlukan menjadi tidak sesuai, metode tersebut harus mengembalikan WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Antarmuka IWICMetadataWriter

AntarmukaIWICMetadataWriter harus diimplementasikan oleh penulis metadata Anda. Selain itu, karena IWICMetadataWriter mewarisi dari IWICMetadataReader, Anda juga harus menerapkan semua metode dari IWICMetadataReader. Karena kedua jenis handler memerlukan pewarisan antarmuka yang sama, Anda mungkin ingin membuat satu kelas yang menyediakan fungsionalitas membaca dan menulis.

Kode berikut menunjukkan definisi antarmuka penulis metadata seperti yang didefinisikan dalam file wincodecsdk.idl.

interface IWICMetadataWriter : IWICMetadataReader
{
    HRESULT SetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT SetValueByIndex(
        [in] UINT nIndex,
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT RemoveValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId
        );

    HRESULT RemoveValueByIndex(
        [in] UINT nIndex
        );
};

Metode SetValue menulis item metadata yang ditentukan ke aliran metadata.

Metode SetValueByIndex menulis item metadata yang ditentukan ke indeks yang ditentukan dalam aliran metadata. Indeks tidak merujuk ke ID tetapi ke posisi item dalam blok metadata.

Metode RemoveValue menghapus item metadata yang ditentukan dari aliran metadata.

Metode RemoveValueByIndex menghapus item metadata pada indeks yang ditentukan dari aliran metadata. Setelah menghapus item, diharapkan item metadata yang tersisa akan menempati indeks kosong jika indeks bukan indeks terakhir. Diharapkan juga bahwa hitungan akan berubah setelah item dihapus.

Ini adalah tanggung jawab penulis metadata untuk mengonversi item PROPVARIANT ke struktur mendasar yang diperlukan oleh format Anda. Namun, tidak seperti pembaca metadata, jenis VARIAN biasanya tidak boleh dipaksa ke berbagai jenis karena pemanggil secara khusus menunjukkan jenis data apa yang akan digunakan.

Penulis metadata Anda harus menerapkan semua item metadata ke aliran gambar, termasuk nilai tersembunyi atau tidak dikenali. Ini termasuk blok metadata berlapis yang tidak diketahui. Namun, ini adalah tanggung jawab encoder untuk mengatur item metadata penting sebelum memulai operasi penyimpanan.

Apabila aliran metadata berisi konten big-endian, penulis metadata bertanggung jawab untuk menukar nilai data apa pun yang diprosesnya. Ini juga bertanggung jawab untuk menginformasikan setiap penulis metadata berlapis bahwa mereka bekerja dengan aliran data big-endian saat mereka menyimpan.

Terapkan dukungan untuk pembuatan dan penghapusan namespace dengan mendukung set dan hapus operasi pada item metadata dengan jenis VT_CLSID (GUID) yang sesuai dengan format metadata. Penulis metadata memanggil fungsi WICSerializeMetadataContent untuk menyematkan dengan benar konten penulis metadata tertanam ke dalam penulis metadata induk.

Jika format metadata Anda mendukung penyandian di tempat, Anda bertanggung jawab untuk mengelola padding yang diperlukan. Untuk informasi selengkapnya tentang pengodean langsung, lihat Gambaran Umum Metadata WIC dan Gambaran Umum Membaca dan Menulis Metadata Gambar.

Antarmuka IWICPersistStream

Antarmuka IWICPersistStream mewarisi dari IPersistStream dan menyediakan metode tambahan untuk menyimpan dan memuat objek dengan menggunakan enumerasi WICPersistOptions.

Kode berikut menunjukkan definisi antarmukaIWICPersistStream seperti yang didefinisikan dalam file wincodecsdk.idl.

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

Metode LoadEx menyediakan handler metadata Anda dengan aliran data yang berisi blok metadata Anda.

Metode SaveEx menserialisasikan metadata ke dalam aliran. Jika aliran yang disediakan sama dengan aliran inisialisasi, Anda harus melakukan pengodean di tempat. Jika pengodean secara langsung didukung, metode ini harus mengembalikan WINCODEC_ERR_TOOMUCHMETADATA ketika bantalan tidak mencukupi untuk melakukan pengodean secara langsung. Jika pengodean langsung tidak didukung, metode ini harus mengembalikan WINCODEC_ERR_UNSUPPORTEDOPERATION.

Metode IPersistStream::GetSizeMax harus diimplementasikan dan harus mengembalikan ukuran konten metadata yang tepat yang akan ditulis dalam penyimpanan berikutnya.

Metode IPersistStream::IsDirty harus diimplementasikan jika penulis metadata diinisialisasi melalui aliran, sehingga gambar dapat dengan andal menentukan apakah kontennya telah berubah.

Jika format metadata Anda mendukung blok metadata bersarang, penulis metadata Anda harus mendelegasikan proses serialisasi konten kepada penulis metadata bersarang saat menyimpan ke aliran data.

Antarmuka IWICStreamProvider

Implementasi antarmukaIWICStreamProvider untuk penulis metadata sama dengan pembaca metadata. Untuk informasi selengkapnya, lihat Bagian Membuat Pembaca Metadata di dokumen ini.

Menginstal dan Mendaftarkan Handler Metadata

Untuk menginstal handler metadata, Anda harus menyediakan rakitan handler dan mendaftarkannya di registri sistem. Anda dapat memutuskan bagaimana dan kapan kunci registri diisi.

Nota

Untuk keterbacaan, GUID heksadesimal aktual tidak ditampilkan dalam kunci registri yang ditunjukkan di bagian berikut dari dokumen ini. Untuk menemukan nilai heksadesimal untuk nama ramah tertentu, lihat file wincodec.idl dan wincodecsdk.idl.

 

Kunci Registri Pengelola Metadata

Setiap handler metadata diidentifikasi oleh CLSID yang unik, dan setiap handler harus mendaftarkan CLSID-nya di bawah GUID kategori ID handler metadata. SETIAP ID kategori jenis handler didefinisikan dalam wincodec.idl; nama ID kategori untuk pembaca CATID_WICMetadataReader, dan nama ID kategori untuk penulis CATID_WICMetadataWriter.

Setiap handler metadata diidentifikasi oleh CLSID unik, dan setiap handler harus mendaftarkan CLSID-nya di bawah kategori ID GUID handler metadata. SETIAP ID kategori jenis handler didefinisikan dalam wincodec.idl; nama ID kategori untuk pembaca CATID_WICMetadataReader, dan nama ID kategori untuk penulis CATID_WICMetadataWriter.

Nota

Dalam daftar kunci registri berikut, {Reader CLSID} mengacu pada CLSID unik yang Anda sediakan untuk pembaca metadata Anda. {Writer CLSID} mengacu pada CLSID unik yang Anda sediakan untuk penulis metadata Anda. {Handler CLSID} mengacu pada CLSID pembaca, CLSID penulis, atau keduanya, tergantung pada handler mana yang Anda sediakan. {Container GUID} mengacu pada objek kontainer (format gambar atau format metadata) yang dapat berisi blok metadata.

 

Kunci registri berikut mendaftarkan handler metadata Anda dengan handler metadata lain yang tersedia:

[HKEY_CLASSES_ROOT\CLSID\{CATID_WICMetadataReaders}\Instance\{Reader CLSID}]
CLSID={Reader CLSID}
Friendly Name="Reader Name"

[HKEY_CLASSES_ROOT\CLSID\{CATID_ WICMetadataWriters}\Instance\{Writer CLSID}]
CLSID={Writer CLSID}
Friendly Name="Writer Name"

Selain mendaftarkan handler Anda di kategori masing-masing, Anda juga harus mendaftarkan kunci tambahan yang memberikan informasi khusus untuk handler. Pembaca dan penulis berbagi persyaratan kunci registri yang sama. Sintaks berikut menunjukkan cara mendaftarkan handler. Pengendali pembaca dan pengendali penulis harus didaftarkan dengan cara ini, dengan menggunakan CLSID mereka masing-masing.

[HKEY_CLASSES_ROOT\CLSID\{CLSID}]
"Vendor"={VendorGUID}
"Date"="yyyy-mm-dd"
"Version"="Major.Minor.Build.Number"
"SpecVersion"="Major.Minor.Build.Number"
"MetadataFormat"={MetadataFormatGUID}
"RequiresFullStream"=dword:1|0
"SupportsPadding"= dword:1|0
"FixedSize"=0

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\InProcServer32]
@="drive:\path\yourdll.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\{LCID}]
Author="Author's Name"
Description = " Metadata Description"
DeviceManufacturer ="Manufacturer Name"
DeviceModels="Device,Device"
FriendlyName="Friendly Name"

Pembaca Metadata

Pendaftaran pembaca metadata juga menyertakan kunci yang menjelaskan bagaimana pembaca dapat disematkan dalam format kontainer. Format kontainer dapat berupa format gambar seperti TIFF atau JPEG; ini juga dapat berupa format metadata lain seperti blok metadata IFD. Format kontainer gambar yang didukung secara asli tercantum dalam wincodec.idl; setiap format kontainer gambar didefinisikan sebagai GUID dengan nama yang dimulai dengan GUID_ContainerFormat. Format kontainer metadata yang didukung secara asli tercantum dalam wincodecsdk.idl; setiap format kontainer metadata didefinisikan sebagai GUID dengan nama yang dimulai dengan GUID_MetadataFormat.

Kunci berikut mendaftarkan kontainer yang didukung pembaca metadata, dan data yang diperlukan untuk dibaca dari kontainer tersebut. Setiap kontainer yang didukung oleh pembaca harus terdaftar dengan cara ini.

[HKEY_CLASSES_ROOT\CLSID\{Reader CLSID}\Containers\{Container GUID}\0]
"Position"=dword:00000000
"Pattern"=hex:ff,ff,ff,...
"Mask"=hex:ff,ff,ff,...
"DataOffset"=dword:00000006

Kunci Pola menjelaskan pola biner yang digunakan untuk mencocokkan blok metadata dengan pembaca. Saat menentukan pola untuk pembaca metadata Anda, harus cukup dapat diandalkan bahwa kecocokan positif berarti pembaca metadata dapat memahami metadata di blok metadata yang sedang diproses.

Kunci DataOffset menjelaskan perpindahan konstan metadata dari header blok. Kunci ini bersifat opsional dan, jika tidak ditentukan, berarti metadata aktual tidak dapat ditemukan menggunakan offset tetap dari header blok.

Penulis Metadata

Pendaftaran penulis metadata juga menyertakan kunci yang menjelaskan cara menulis header sebelum konten metadata yang disematkan dalam format kontainer. Seperti halnya pembaca, format kontainer dapat berupa format gambar atau blok metadata lainnya.

Kunci berikut mendaftarkan kontainer yang didukung penulis metadata, dan data yang diperlukan untuk menulis header dan metadata. Setiap kontainer yang didukung oleh penulis harus terdaftar dengan cara ini.

[HKEY_CLASSES_ROOT\CLSID\{Writer CLSID}\Containers\{Container GUID}]
"WritePosition"=dword:00000000
"WriteHeader"=hex:ff,ff,ff,...
"WriteOffset"=dword:00000000

Kunci WriteHeader menjelaskan pola biner header blok metadata yang akan ditulis. Pola biner ini bertepatan dengan kunci Pola pembaca format metadata.

Kunci WriteOffset menjelaskan offset tetap dari header blok di mana metadata seharusnya ditulis. Kunci ini bersifat opsional dan, jika tidak ditentukan, berarti metadata aktual tidak boleh ditulis dengan header.

Penandatanganan Handler Metadata

Semua penangan metadata harus ditandatangani secara digital untuk berpartisipasi dalam proses penemuan WIC. WIC tidak akan memuat handler apa pun yang tidak ditandatangani oleh otoritas sertifikat tepercaya. Untuk informasi selengkapnya tentang penandatanganan digital, lihat Pengenalan Penandatanganan Kode.

Pertimbangan Khusus

Bagian berikut menyertakan informasi tambahan yang harus Anda pertimbangkan saat membuat handler metadata Anda sendiri.

PROPVARIANTS

WIC menggunakan PROPVARIANT untuk mewakili item metadata baik untuk membaca maupun menulis. PROPVARIANT menyediakan jenis data dan nilai data untuk item metadata yang digunakan dalam format metadata. Sebagai penulis handler metadata, Anda memiliki banyak fleksibilitas tentang bagaimana data disimpan dalam format metadata dan bagaimana data diwakili dalam blok metadata. Tabel berikut ini menyediakan panduan untuk membantu Anda memutuskan jenis PROPVARIANT yang sesuai untuk digunakan dalam situasi yang berbeda.

Jenis metadata adalah... Gunakan jenis PROPVARIANT Properti PROPVARIANT
Kosong atau tidak ada. VT_EMPTY Tidak berlaku.
Tidak Terdefinisi VT_BLOB Gunakan properti blob untuk mengatur ukuran dan penunjuk ke objek BLOB yang dialokasikan menggunakan CoTaskMemAlloc.
Blok metadata. VT_UNKNOWN Jenis ini menggunakan properti punkVal.
Larik jenis-jenis. VT_VECTOR | VT_{type} Gunakan properti ca{type} untuk mengatur hitungan dan penunjuk ke array yang dialokasikan menggunakan CoTaskMemAlloc.
Sekumpulan blok metadata. VT_VECTOR | VT_VARIANT Gunakan properti capropvar untuk mengatur array varian.
Nilai rasional yang ditandatangani. VT_I8 Gunakan properti hVal untuk mengatur nilai. Atur kata tinggi ke penyebut dan kata rendah ke pembilang.
Nilai rasional. VT_UI8 Gunakan properti uhVal untuk mengatur nilai. Atur HighPart ke denominator dan LowPart ke numerator. Perhatikan bahwa LowPart adalah integer tanpa tanda. Pembilang harus dikonversi dari integer tanpa tanda ke integer untuk memastikan bahwa bit tanda dipertahankan jika ada.

 

Untuk menghindari redundansi dalam mewakili item array, jangan gunakan array yang aman; hanya gunakan array sederhana. Ini mengurangi pekerjaan yang perlu dilakukan aplikasi saat menginterpretasikan jenis PROPVARIANT.

Hindari menggunakan VT_BYREF dan menyimpan nilai sebaris jika memungkinkan. VT_BYREF tidak efisien untuk jenis kecil (umum untuk item metadata) dan tidak memberikan informasi ukuran.

Sebelum menggunakan PROPVARIANT, selalu panggil PropVariantInit untuk menginisialisasi nilai. Ketika Anda selesai dengan PROPVARIANT, selalu gunakan PropVariantClear untuk melepaskan memori apa pun yang dialokasikan untuk variabel.

Pengelola 8BIM

Saat menulis handler metadata untuk blok metadata 8BIM, Anda harus menggunakan tanda tangan yang merangkum tanda tangan 8BIM dan ID. Misalnya, pembaca metadata 8BIMIPTC asli menyediakan informasi registri berikut untuk penemuan pembaca:

[HKEY_CLASSES_ROOT\CLSID\{0010668C-0801-4DA6-A4A4-826522B6D28F}\Containers\{16100D66-8570-4BB9-B92D-FDA4B23ECE67}\0]
"Position"=dword:00000000
"Pattern"=hex:38,42,49,4d,04,04
"Mask"=hex:ff,ff,ff,ff,ff,ff
"DataOffset"=dword:00000006

Pembaca 8BIMIPTC memiliki pola terdaftar 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04. Empat byte pertama (0x38, 0x42, 0x49, 0x4D) adalah tanda tangan 8BIM, dan dua byte terakhir (0x04, 0x04) adalah ID untuk catatan IPTC.

Jadi, untuk menulis pembaca metadata 8BIM untuk informasi resolusi, Anda memerlukan pola terdaftar 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED. Sekali lagi, empat byte pertama (0x38, 0x42, 0x49, 0x4D) adalah tanda tangan 8BIM. Namun, dua byte terakhir (0x03, 0xED), adalah ID informasi resolusi seperti yang didefinisikan oleh format PSD.

Konseptual

Gambaran Umum Komponen Pencitraan Windows

Gambaran Umum Metadata WIC

Gambaran Umum Bahasa Kueri Metadata

Gambaran Umum Pembacaan dan Penulisan Metadata Gambar

Cara: Mengodekan ulang Gambar JPEG dengan Metadata

Sumber Daya Lain

Cara Menulis CODEC WIC-Enabled