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.

Pengantar

Seperti yang dibahas dalam Gambaran Umum Metadata WIC, sering kali 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 penangan 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 membuat serialisasi 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 durasi 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.

Catatan

Jika format metadata Anda memiliki batasan yang merender beberapa metode antarmuka yang diperlukan tidak pantas, metode tersebut harus mengembalikan WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Antarmuka IWICMetadataReader

Antarmuka IWICMetadataReader harus 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 tersemat) 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 bahwa metode ini mengambil item metadata yang memiliki skema atau ID tertentu.

Metode GetEnumerator mengembalikan enumerator dari setiap item metadata di blok metadata. Ini memungkinkan aplikasi untuk 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 penangan metadata baru. Jika tidak ada pembaca metadata yang tersedia untuk blok berlapis, buat dan kembalikan pembaca metadata yang tidak diketahui. Untuk membuat pembaca metadata baru untuk blok yang disematkan, panggil metode CreateMetadataReaderFromContainer atau CreateMetadataReader pabrik komponen, atau panggil fungsi WICMatchMetadataContent .

Jika aliran metadata berisi konten big-endian, pembaca metadata bertanggung jawab untuk menukar 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 memaksa ID ke dalam jenis yang diharapkan. Misalnya, pembaca IFD akan memaksa ID untuk mengetik VT_UI2 bertepatan dengan jenis data ID tag IFD USHORT. Jenis input dan jenis yang diharapkan keduanya 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 antarmuka IWICPersistStream 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 sub-aliran yang diposisikan di 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 membuat serialisasi blok metadata Anda. Ketika SaveEx digunakan dalam pembaca metadata, saveEx harus mengembalikan WINCODEC_ERR_UNSUPPORTEDOPERATION.

Antarmuka IWICStreamProvider

Antarmuka IWICStreamProvider memungkinkan 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 referensi 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 enumerasi WICPersistOptions .

Metode GetPreferredVendorGUID mengembalikan GUID vendor pembaca metadata.

Metode RefreshStream me-refresh aliran metadata. Metode ini harus memanggil LoadEx dengan aliran NULL untuk setiap blok metadata berlapis. 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 membuat serialisasi blok metadata ke bingkai gambar, atau di luar bingkai individual jika format gambar mendukungnya. Akses utama ke penulis metadata dalam codec adalah melalui antarmuka IWICMetadataBlockWriter 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.

Catatan

Jika format metadata Anda memiliki batasan yang merender beberapa metode antarmuka yang diperlukan tidak pantas, metode tersebut harus mengembalikan WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Antarmuka IWICMetadataWriter

Antarmuka IWICMetadataWriter harus diimplementasikan oleh penulis metadata Anda. Selain itu, karena IWICMetadataWriter mewarisi dari IWICMetadataReader, Anda juga harus menerapkan semua metode 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 jenis yang berbeda 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 dikenal. Ini termasuk blok metadata berlapis yang tidak diketahui. Namun, ini adalah tanggung jawab encoder untuk mengatur item metadata penting sebelum memulai operasi penyimpanan.

Jika 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 konten penulis metadata berlapis dengan benar ke dalam penulis metadata induk.

Jika format metadata Anda mendukung pengodean di tempat, Anda bertanggung jawab untuk mengelola padding yang diperlukan. Untuk informasi selengkapnya tentang pengodean di tempat, 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 antarmuka IWICPersistStream 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 di tempat didukung, metode ini harus mengembalikan WINCODEC_ERR_TOOMUCHMETADATA ketika pengisi tidak cukup untuk melakukan pengodean di tempat. Jika pengodean di tempat 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 berlapis, penulis metadata Anda harus mendelegasikan ke penulis metadata berlapis yang menserialisasikan kontennya saat menyimpan ke aliran.

Antarmuka IWICStreamProvider

Implementasi antarmuka IWICStreamProvider 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 perakitan handler dan mendaftarkannya di registri sistem. Anda dapat memutuskan bagaimana dan kapan kunci registri diisi.

Catatan

Untuk keterbacaan, GUID heksadesimal aktual tidak ditampilkan di 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 Handler Metadata

Setiap handler metadata diidentifikasi oleh CLSID yang unik, dan setiap handler diperlukan untuk mendaftarkan CLSID-nya di bawah GUID ID kategori handler metadata. ID kategori setiap 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 yang unik, dan setiap handler diperlukan untuk mendaftarkan CLSID-nya di bawah GUID ID kategori handler metadata. ID kategori setiap jenis handler didefinisikan dalam wincodec.idl; nama ID kategori untuk pembaca CATID_WICMetadataReader, dan nama ID kategori untuk penulis CATID_WICMetadataWriter.

Catatan

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. Handler pembaca dan handler penulis harus terdaftar dengan cara ini, menggunakan CLSID 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; itu juga bisa menjadi 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 membaca dari kontainer tersebut. Setiap kontainer yang didukung oleh pembaca harus didaftarkan 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 sehingga kecocokan positif berarti pembaca metadata dapat memahami metadata di blok metadata yang sedang diproses.

Kunci DataOffset menjelaskan offset tetap 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 didaftarkan 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 tempat metadata harus ditulis. Kunci ini bersifat opsional dan, jika tidak ditentukan, berarti metadata aktual tidak boleh ditulis dengan header .

Menandatangani Penangan 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 Pengantar Penandatanganan Kode.

Pertimbangan Khusus

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

PROPVARIANTS

WIC menggunakan PROPVARIANT untuk mewakili item metadata untuk membaca dan 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 dapat diterapkan.
Tidak ditentukan. 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.
Array jenis. VT_VECTOR | VT_{type} Gunakan properti ca{type} untuk mengatur hitungan dan penunjuk ke array yang dialokasikan menggunakan CoTaskMemAlloc.
Array 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 denominator dan kata rendah ke numerator.
Nilai rasional. VT_UI8 Gunakan properti uhVal untuk mengatur nilai. Atur HighPart ke denominator dan LowPart ke numerator. Perhatikan bahwa LowPart adalah int yang tidak ditandatangani. Pembiasa harus dikonversi dari int yang tidak ditandatangani ke int 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 panggil PropVariantClear untuk merilis memori apa pun yang dialokasikan untuk variabel.

Penangan 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 Membaca dan Menulis Metadata Gambar

Cara: Mengodekan ulang Gambar JPEG dengan Metadata

Sumber Daya Lainnya

Cara Menulis WIC-Enabled CODEC