Meta Veri Genişletilebilirliğine Genel Bakış
Bu konu başlığı altında, hem meta veri okuyucuları hem de yazıcılar da dahil olmak üzere Windows Imaging Bileşeni (WIC) için özel meta veri işleyicileri oluşturma gereksinimleri tanıtılmaktadır. Ayrıca WIC çalışma zamanı bileşeni bulma işlemini özel meta veri işleyicilerinizi içerecek şekilde genişletme gereksinimlerini de açıklar.
Bu konu aşağıdaki bölümleri içerir.
- Önkoşullar
- Giriş
- Metadata Okuyucu Oluşturma
- Bir Meta Veri Yazıcı Oluşturma
-
Bir Meta Veri İşleyicisini Yükleme ve Kaydetme
- Meta Veri İşleyicisi Kayıt Defteri Anahtarları
- Meta Veri Okuyucuları
- Meta Veri Yazıcıları
- Meta Veri İşleyicisi İmzalama
- Özel Konular
- İlgili konular
Önkoşullar
Bu konuyu anlamak için WIC, bileşenleri ve görüntülere yönelik meta veriler hakkında ayrıntılı bilgi sahibi olmanız gerekir. WIC meta verileri hakkında daha fazla bilgi için bkz. WIC Meta Verilerine Genel Bakış. WIC bileşenleri hakkında daha fazla bilgi için windows görüntüleme bileşenine genel bakış bölümüne bakın.
Giriş
WIC Meta Verilerine Genel Bakışaçıklandığı gibi, bir görüntüde genellikle her biri farklı meta veri biçimlerinde farklı bilgi türlerini gösteren birden çok meta veri bloğu vardır. Bir görüntüye katıştırılmış meta veri biçimiyle etkileşime geçmek için uygulamanın uygun bir meta veri işleyicisi kullanması gerekir. WIC, Exif veya XMP gibi belirli meta veri türlerini okumanızı ve yazmanızı sağlayan çeşitli meta veri işleyicileri (hem meta veri okuyucuları hem de yazıcılar) sağlar.
Sağlanan yerel işleyicilere ek olarak WIC, WIC'nin çalışma zamanı bileşeni keşfine katılan yeni meta veri işleyicileri oluşturmanıza olanak tanıyan API'ler sağlar. Bu, WIC kullanan uygulamaların özel meta veri biçimlerinizi okumasını ve yazmasını sağlar.
Aşağıdaki adımlar, meta veri işleyicilerinizin WIC'nin çalışma zamanı meta veri bulma işlemine katılmasını sağlar.
- Özel meta veri biçiminizi okumak için gerekli WIC arabirimlerini kullanıma sunan bir meta veri okuyucu işleyici sınıfı (IWICMetadataReader) uygulayın. Bu, WIC tabanlı uygulamaların meta veri biçiminizi yerel meta veri biçimlerini okuduğu gibi okumasını sağlar.
- Özel meta veri biçiminizi kodlamak için gerekli WIC arabirimlerini kullanıma sunan bir meta veri yazıcı işleyici sınıfı (IWICMetadataWriter) uygulayın. Bu, WIC tabanlı uygulamaların meta veri biçiminizi desteklenen görüntü biçimlerine göre seri hale getirmesini sağlar.
- Meta veri işleyicilerinizi dijital olarak imzalayın ve kaydedin. Bu, kayıt defterindeki tanımlayıcı deseni görüntü dosyasına eklenmiş desenle eşleştirerek meta veri işleyicilerinizin çalışma zamanında bulunmasını sağlar.
Meta Veri Okuyucusu Oluşturma
Bir codec bileşeni içindeki meta veri bloklarına ana erişim, her WIC codec bileşeninin uyguladığı IWICMetadataBlockReader arabiriminden geçer. Bu arabirim, her bir blok için uygun meta veri işleyicisinin bulunabilmesi ve örneklenmesi için görüntü biçiminde eklenmiş meta veri bloklarının her birini numaralandırır. WIC tarafından tanınmayan meta veri blokları bilinmiyor olarak kabul edilir ve GUID CLSID_WICUnknownMetadataReader olarak tanımlanır. Meta veri biçiminizin WIC tarafından tanınması için üç arabirim uygulayan bir sınıf oluşturmanız gerekir: IWICMetadataReader, IWICPersistStreamve IWICStreamProvider.
Not
Meta veri biçiminizde gerekli arabirimlerin bazı yöntemlerini uygunsuz hale getiren kısıtlamalar varsa, bu tür yöntemler WINCODEC_ERR_UNSUPPORTEDOPERATION döndürmelidir.
IWICMetadataReader Arabirimi
IWICMetadataReader arabirimi, meta veri okuyucu oluşturulurken uygulanmalıdır. Bu arabirim, meta veri biçiminin veri akışı içinde alttaki meta veri öğelerine erişim sağlar.
Aşağıdaki kod, wincodecsdk.idl dosyasında tanımlandığı gibi meta veri okuyucu arabiriminin tanımını gösterir.
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
);
};
GetMetadataFormat yöntemi meta veri biçiminizin GUID değerini döndürür.
GetMetadataHandlerInfo yöntemi, meta veri işleyiciniz hakkında bilgi sağlayan bir IWICMetadataHandlerInfo arabirimi döndürür. Bu, meta veri biçimini destekleyen görüntü biçimleri ve meta veri okuyucunuzun tam meta veri akışına erişmesi gerekip gerekmediği gibi bilgileri içerir.
GetCount yöntemi, meta veri akışında bulunan tek tek meta veri öğelerinin (eklenmiş meta veri blokları dahil) sayısını döndürür.
GetValueByIndex yöntemi, dizin değerine göre bir meta veri öğesi döndürür. Bu yöntem, uygulamaların bir meta veri bloğundaki her meta veri öğesinde döngü gerçekleştirmesini sağlar. Aşağıdaki kod, bir uygulamanın meta veri bloğundaki her meta veri öğesini almak için bu yöntemi nasıl kullanabileceğini gösterir.
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);
}
}
GetValue yöntemi belirli bir meta veri öğesini şema ve/veya kimliğe göre alır. Bu yöntem, GetValueByIndex yöntemine benzer, ancak belirli bir şema veya kimliği olan bir meta veri öğesini alır.
GetEnumerator yöntemi, meta veri bloğundaki her meta veri öğesinin bir numaralandırıcısını döndürür. Bu, uygulamaların meta veri biçiminizde gezinmek için bir numaralandırıcı kullanmasını sağlar.
Meta veri biçiminizde meta veri öğeleri için bir şema kavramı yoksa, GetValue... yöntemleri bu özelliği yoksaymalıdır. Ancak biçiminiz şema adlandırmayı destekliyorsa, NULL değeri tahmin etmelisiniz.
Meta veri öğesi eklenmiş bir meta veri bloğuysa, eklenmiş içeriğin alt akışından bir meta veri işleyicisi oluşturun ve yeni meta veri işleyicisini döndürin. İç içe yerleştirilmiş blok için kullanılabilir meta veri okuyucusu yoksa, bilinmeyen bir meta veri okuyucusu oluşturun ve döndürin. Katıştırılmış blok için yeni bir meta veri okuyucu oluşturmak için bileşen fabrikasının CreateMetadataReaderFromContainer veya CreateMetadataReader yöntemlerini çağırın veya WICMatchMetadataContent işlevini çağırın.
Meta veri akışı büyük endian içerik içeriyorsa, meta veri okuyucu işlediği tüm veri değerlerini değiştirmekle sorumludur. Ayrıca, iç içe meta veri okuyuculara büyük uç veri akışıyla çalıştıklarını bildirmek de sorumludur. Ancak, tüm değerler little-endian biçiminde döndürülmelidir.
Meta veri öğesi kimliğinin meta veri biçimine karşılık gelen bir VT_CLSID
(GUID) olduğu sorguları destekleyerek ad alanı gezintisi desteğini uygulayın. Eğer bu biçim için iç içe bir meta veri okuyucu ayrıştırma sırasında tanımlanırsa, döndürülmesi gerekir. Bu, uygulamaların meta veri biçiminizde arama yapmak için meta veri sorgu okuyucu kullanmasına olanak tanır.
Kimliğine göre bir meta veri öğesi alırken, kimliği beklenen türe zorlamak için PropVariantChangeType İşlevi kullanmanız gerekir. Örneğin, IFD okuyucu, bir ID'yi, IFD etiket ID'si USHORT'un veri türüyle çakışacak şekilde tip VT_UI2
'e dönüştürür. Bunu yapmak için hem giriş türü hem de beklenen tür PROPVARIANT olmalıdır. Bu gerekli değildir, ancak bu zorlama, meta veri öğelerini sorgulamak için okuyucuyu çağıran kodu basitleştirir.
IWICPersistStream Arabirimi
IWICPersistStream arabirimi IPersistStream devralır ve WICPersistOptions numaralandırmasını kullanarak nesneleri kaydetmek ve yüklemek için ek yöntemler sağlar.
Aşağıdaki kod, wincodecsdk.idl dosyasında tanımlanan IWICPersistStream arabiriminin tanımını gösterir.
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
);
};
LoadEx yöntemi, meta veri okuyucunuza meta veri bloğunuzu içeren bir veri akışı sağlar. Okuyucunuz bu akışı ayrıştırarak temel meta veri öğelerine erişir. Meta veri okuyucunuz ham meta veri içeriğinin başında konumlandırılmış bir alt akışla başlatılır. Okuyucunuz tam akışı gerektirmiyorsa, alt akış yalnızca meta veri bloğunun içeriğiyle sınırlıdır; aksi takdirde, tam meta veri akışı meta veri bloğunuzun başında ayarlanan konumla birlikte sağlanır.
SaveEx yöntemi meta veri yazarları tarafından meta veri bloğunuzu seri hale getirmek için kullanılır. SaveEx bir meta veri okuyucuda kullanıldığında WINCODEC_ERR_UNSUPPORTEDOPERATION döndürmelidir.
IWICStreamProvider Arabirimi
IWICStreamProvider arabirimi, meta veri okuyucunuzun içerik akışına başvurular sağlamasına, akış hakkında bilgi sağlamasına ve akışın önbelleğe alınmış sürümlerini yenilemesine olanak tanır.
Aşağıdaki kod, wincodecsdk.idl dosyasında tanımlanan IWICStreamProvider arabiriminin tanımını gösterir.
interface IWICStreamProvider : IUnknown
{
HRESULT GetStream(
[out] IStream **ppIStream
);
HRESULT GetPersistOptions(
[out] DWORD *pdwPersistOptions
);
HRESULT GetPreferredVendorGUID(
[out] GUID *pguidPreferredVendor
);
HRESULT RefreshStream(
);
};
GetStream yöntemi meta veri akışınıza bir referans sağlar. Döndürdüğünüz akışın, akış işaretçisinin başlangıç konumuna sıfırlanmış olması gerekir. Meta veri biçiminiz tam akış erişimi gerektiriyorsa, başlangıç konumu meta veri bloğunuzun başlangıcı olmalıdır.
GetPersistOptions yöntemi, WICPersistOptions numaralandırmasından akışın geçerli seçeneklerini döndürür.
GetPreferredVendorGUID yöntemi, meta veri okuyucu satıcısının GUID değerini döndürür.
RefreshStream yöntemi meta veri akışını yeniler. Bu yöntem, iç içe meta veri blokları için NULL akışına sahip LoadEx çağırmalıdır. Yerinde düzenleme nedeniyle iç içe meta veri blokları ve öğeleri artık varolmayabileceği için bu gereklidir.
Meta Veri Yazıcı Oluşturma
Meta veri yazıcısı, bir meta veri işleyici türüdür ve bir meta veri bloğunu ya görüntü biçimi destekliyorsa bir görüntü çerçevesine ya da tek bir çerçevenin dışına seri hale getirmenin bir yolunu sağlar. Bir codec bileşenindeki meta veri yazıcılarına ana erişim, her WIC kodlayıcının uyguladığı IWICMetadataBlockWriter arabiriminden geçer. Bu arabirim, uygulamaların her meta veri bloğu için uygun meta veri yazıcının bulunabilmesi ve örneklenmesi için bir görüntüye eklenmiş meta veri bloklarının her birini listelemesini sağlar. Karşılık gelen meta veri yazıcısı olmayan meta veri blokları bilinmiyor olarak kabul edilir ve GUID CLSID_WICUnknownMetadataReader olarak tanımlanır. WIC özellikli uygulamaların meta veri biçiminizi seri hale getirmesini ve yazmasını sağlamak için şu arabirimleri uygulayan bir sınıf oluşturmanız gerekir: IWICMetadataWriter, IWICMetadataReader, IWICPersistStreamve IWICStreamProvider.
Not
Meta veri biçiminizde gerekli arabirimlerin bazı yöntemlerini uygunsuz hale getiren kısıtlamalar varsa, bu tür yöntemler WINCODEC_ERR_UNSUPPORTEDOPERATION döndürmelidir.
IWICMetadataWriter Arabirimi
IWICMetadataWriter arabirimi, meta veri yazıcınız tarafından uygulanmalıdır. Ayrıca, IWICMetadataWriterIWICMetadataReaderdevraldığından, IWICMetadataReadertüm yöntemlerini de uygulamanız gerekir. her iki işleyici türü de aynı arabirim devralmayı gerektirdiğinden, hem okuma hem de yazma işlevselliği sağlayan tek bir sınıf oluşturmak isteyebilirsiniz.
Aşağıdaki kod, wincodecsdk.idl dosyasında tanımlandığı gibi meta veri yazıcı arabiriminin tanımını gösterir.
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
);
};
SetValue yöntemi, belirtilen meta veri öğesini meta veri akışına yazar.
SetValueByIndex yöntemi, belirtilen meta veri öğesini meta veri akışında belirtilen dizine yazar. Dizin, kimliğine değil, meta veri bloğu içindeki öğenin konumuna başvurur.
RemoveValue yöntemi, belirtilen meta veri öğesini meta veri akışından kaldırır.
RemoveValueByIndex yöntemi, belirtilen dizindeki meta veri öğesini meta veri akışından kaldırır. Bir öğe kaldırıldıktan sonra, dizin son dizin değilse kalan meta veri öğelerinin boş dizini kaplaması beklenir. Öğe kaldırıldıktan sonra sayımın değişmesi de beklenir.
PROPVARIANT öğelerini biçiminizin gerektirdiği temel yapıya dönüştürmek meta veri yazarının sorumluluğundadır. Ancak, meta veri okuyucusunun aksine, çağrıcı hangi veri türünü kullanması gerektiğini özellikle belirttiğinden VARYANT türleri normalde farklı türlere dönüştürülmemelidir.
Meta veri yazıcınızın gizli veya tanınmayan değerler de dahil olmak üzere tüm meta veri öğelerini görüntü akışına işlemesi gerekir. Bu, bilinmeyen iç içe meta veri bloklarını içerir. Ancak, kaydetme işlemini başlatmadan önce tüm kritik meta veri öğelerini ayarlamak kodlayıcının sorumluluğundadır.
Meta veri akışı büyük endian içerik içeriyorsa, meta veri yazarı işlediği tüm veri değerlerini değiştirmekle sorumludur. Ayrıca, iç içe meta veri yazarlarını kaydederken büyük uç veri akışıyla çalıştıklarını bildirmekten de sorumludur.
Meta veri formatına karşılık gelen VT_CLSID
türündeki (GUID) meta veri öğelerinde küme oluşturma ve silme işlemlerini destekleyerek ad alanı yaratma ve silme desteğini uygulayın. Meta veri yazıcısı, iç içe meta veri yazıcı içeriğini üst meta veri yazıcısına düzgün bir şekilde eklemek için WICSerializeMetadataContent işlevini çağırır.
Meta veri biçiminiz yerinde kodlamayı destekliyorsa, gerekli doldurmayı yönetmek sizin sorumluluğunuzdadır. Yerinde kodlama hakkında daha fazla bilgi için bkz. WIC Meta Verilerine Genel Bakış ve Görüntü Meta Verilerini Okuma ve Yazma genel bakışı.
IWICPersistStream Arabirimi
IWICPersistStream arabirimi IPersistStream devralır ve WICPersistOptions numaralandırmasını kullanarak nesneleri kaydetmek ve yüklemek için ek yöntemler sağlar.
Aşağıdaki kod, wincodecsdk.idl dosyasında tanımlanan IWICPersistStream arabiriminin tanımını gösterir.
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
);
};
LoadEx yöntemi, meta veri işleyicinize meta veri bloğunuzu içeren bir veri akışı sağlar.
SaveEx yöntemi meta verileri bir akış halinde serileştirir. Sağlanan akış başlatma akışıyla aynıysa yerinde kodlama gerçekleştirmeniz gerekir. Yerinde kodlama destekleniyorsa, yerinde kodlama gerçekleştirmek için yetersiz doldurma olduğunda bu yöntem WINCODEC_ERR_TOOMUCHMETADATA döndürmelidir. Yerinde kodlama desteklenmiyorsa, bu yöntem WINCODEC_ERR_UNSUPPORTEDOPERATION döndürmelidir.
IPersistStream::GetSizeMax yöntemi uygulanmalıdır ve sonraki kaydetmede yazılacak meta veri içeriğinin tam boyutunu döndürmelidir.
IPersistStream::IsDirty yöntemi, meta veri yazıcısı bir akış aracılığıyla başlatılırsa uygulanmalıdır; böylece görüntü, içeriğinin değişip değişmediğini güvenilir bir şekilde belirleyebilir.
Meta veri biçiminiz iç içe meta veri bloklarını destekliyorsa, meta veri yazıcınız bir akışa kaydederken içeriğini seri hale getirme işlemini iç içe meta veri yazıcılarına devretmelidir.
IWICStreamProvider Arayüzü
Meta veri yazıcısı için IWICStreamProvider arabiriminin uygulanması, meta veri okuyucuyla aynıdır. Daha fazla bilgi için bu belgenin Meta Veri Okuyucusu Oluşturma bölümüne bakın.
Meta Veri İşleyicisi Yükleme ve Kaydetme
Meta veri işleyicisini yüklemek için işleyici derlemesini sağlamanız ve bunu sistem kayıt defterine kaydetmeniz gerekir. Kayıt defteri anahtarlarının nasıl ve ne zaman dolduruleceğine karar vekleyebilirsiniz.
Not
Okunabilirlik için, gerçek onaltılık GUID'ler bu belgenin aşağıdaki bölümlerinde belirtilen kayıt defteri anahtarlarında yer almaz. Belirtilen dostça ismin onaltılık değerini bulmak için wincodec.idl ve wincodecsdk.idl dosyalarına bakın.
Meta Veri İşleyicisi Kayıt Defteri Anahtarları
Her meta veri işleyicisi benzersiz bir CLSID tarafından tanımlanır ve her işleyicinin CLSID'sini meta veri işleyicisinin kategori kimliği GUID'si altına kaydetmesi gerekir. Her işleyici türünün kategori kimliği wincodec.idl dosyasında tanımlanır; okuyucuların kategori kimliği adı CATID_WICMetadataReader ve yazarlar için kategori kimliği adı CATID_WICMetadataWriter.
Her meta veri işleyicisi benzersiz bir CLSID tarafından tanımlanır ve her işleyicinin CLSID'sini meta veri işleyicisinin kategori kimliği GUID'si altına kaydetmesi gerekir. Her işleyici türünün kategori kimliği wincodec.idl dosyasında tanımlanır; okuyucuların kategori kimliği adı CATID_WICMetadataReader ve yazarlar için kategori kimliği adı CATID_WICMetadataWriter.
Not
Aşağıdaki kayıt defteri anahtarı listelerinde {Reader CLSID}, meta veri okuyucunuz için sağladığınız benzersiz CLSID'ye başvurur. {Yazıcı CLSID}, meta veri yazıcınız için sağladığınız benzersiz CLSID'yi ifade eder. {Handler CLSID}, sağladığınız işleyicilere bağlı olarak okuyucunun CLSID'sini, yazarın CLSID'sini veya her ikisini de ifade eder. {Container GUID}, meta veri bloğunu içerebilen kapsayıcı nesnesine (görüntü biçimi veya meta veri biçimi) başvuruyor.
Aşağıdaki kayıt defteri anahtarları, meta veri işleyicinizi kullanılabilir diğer meta veri işleyicileriyle kaydeder:
[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"
İşleyicilerinizi ilgili kategorilerine kaydetmeye ek olarak, işleyiciye özgü bilgiler sağlayan ek anahtarları da kaydetmeniz gerekir. Okuyucular ve yazarlar benzer kayıt defteri anahtarı gereksinimlerini paylaşır. Aşağıdaki söz dizimi, bir işleyicinin nasıl kaydedileceğini göstermektedir. Hem okuyucu işleyicisinin hem de yazıcı işleyicisinin ilgili CLSID'leri kullanılarak bu şekilde kaydedilmesi gerekir:
[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"
Meta Veri Okuyucuları
Meta veri okuyucu kaydı, okuyucunun kapsayıcı biçiminde nasıl gömüldüğünü belirten anahtarlar da içerir. Kapsayıcı biçimi TIFF veya JPEG gibi bir görüntü biçimi olabilir; ifD meta veri bloğu gibi başka bir meta veri biçimi de olabilir. Yerel olarak desteklenen görüntü kapsayıcı biçimleri wincodec.idl dosyasında listelenir; her görüntü kapsayıcı biçimi, GUID_ContainerFormat ile başlayan bir ada sahip bir GUID olarak tanımlanır. Yerel olarak desteklenen meta veri kapsayıcı biçimleri wincodecsdk.idl içinde listelenir; her meta veri kapsayıcı biçimi, GUID_MetadataFormat ile başlayan bir ada sahip bir GUID olarak tanımlanır.
Aşağıdaki anahtarlar, meta veri okuyucunun desteklediği bir kapsayıcıyı ve bu kapsayıcıdan okumak için gereken verileri kaydeder. Okuyucu tarafından desteklenen her kapsayıcının bu şekilde kaydedilmesi gerekir.
[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
Desen anahtarı, meta veri bloğunu okuyucuyla eşleştirmek için kullanılan ikili deseni açıklar. Meta veri okuyucunuz için bir desen tanımlarken, pozitif eşleşmenin meta veri okuyucunun işlenen meta veri bloğundaki meta verileri anlayabileceği anlamına gelecek kadar güvenilir olması gerekir.
DataOffset anahtarı, meta verilerin blok üst bilgisinden sabit uzaklığını açıklar. Bu anahtar isteğe bağlıdır ve belirtilmezse gerçek meta verilerin blok üst bilgisinden sabit bir uzaklık kullanılarak bulunamayacağı anlamına gelir.
Meta Veri Yazıcıları
Meta veri yazıcı kaydı, kapsayıcı biçimine gömülü meta veri içeriğinin öncesinde yer alan üst bilginin nasıl yazıldığını açıklayan anahtarlar da içerir. Okuyucuda olduğu gibi, kapsayıcı biçimi bir görüntü biçimi veya başka bir meta veri bloğu olabilir.
Aşağıdaki anahtarlar, meta veri yazıcısının desteklediği bir kapsayıcıyı ve üst bilgi ile meta verileri yazmak için gereken verileri kaydeder. Yazar tarafından desteklenen her kapsayıcının bu şekilde kaydedilmesi gerekir.
[HKEY_CLASSES_ROOT\CLSID\{Writer CLSID}\Containers\{Container GUID}]
"WritePosition"=dword:00000000
"WriteHeader"=hex:ff,ff,ff,...
"WriteOffset"=dword:00000000
WriteHeader anahtarı, yazılacak meta veri bloğu üst bilgisinin ikili desenini açıklar. Bu ikili desen meta veri biçiminin okuyucu Desen anahtarıyla çakışır.
WriteOffset anahtarı, meta verilerin yazılması gereken blok üst bilgisinden sabit uzaklığı açıklar. Bu anahtar isteğe bağlıdır ve belirtilmezse, bu durumda gerçek meta verilerin üst bilgiyle birlikte yazılmaması gerektiğini ifade eder.
Meta Veri İşleyicisi İmzalama
WIC bulma işlemine katılmak için tüm meta veri işleyicilerinin dijital olarak imzalanması gerekir. WIC, güvenilir bir sertifika yetkilisi tarafından imzalı olmayan hiçbir işleyiciyi yüklemez. Dijital imzalama hakkında daha fazla bilgi için bkz. kod imzalamaya giriş .
Dikkat Edilmesi Gereken Özel Noktalar
Aşağıdaki bölümler, kendi meta veri işleyicilerinizi oluştururken göz önünde bulundurmanız gereken ek bilgileri içerir.
PROPVARIANTS
WIC, hem okuma hem de yazma için bir meta veri öğesini temsil etmek için PROPVARIANT kullanır. PROPVARIANT, meta veri biçiminde kullanılan bir meta veri öğesi için veri türü ve veri değeri sağlar. Bir meta veri işleyicisinin yazarı olarak, verilerin meta veri biçiminde nasıl depolandığı ve verilerin bir meta veri bloğu içinde nasıl gösterildiği konusunda çok fazla esnekliğiniz vardır. Aşağıdaki tabloda, farklı durumlarda kullanılacak uygun PROPVARIANT türüne karar vermenize yardımcı olacak yönergeler sağlanmaktadır.
Meta veri türü... | PROPVARIANT türünü kullanma | PROPVARIANT Özelliği |
---|---|---|
Boş veya varolmayan. | VT_EMPTY | Uygulanamaz. |
Tanımsız. | VT_BLOB | Boyutu ve işaretçiyi CoTaskMemAlloc kullanılarak ayrılan BLOB nesnesine ayarlamak için blob özelliğini kullanın. |
Meta veri bloğu. | VT_UNKNOWN | Bu tür punkVal özelliğini kullanır. |
Çeşitli tiplerin bir dizisi. | VT_VECTOR | VT_{type} | CoTaskMemAlloc kullanılarak ayrılan dizi için sayıyı ve işaretçiyi ayarlamak için ca{type} özelliğini kullanın. |
Meta veri blokları dizisi. | VT_VECTOR | VT_VARIANT | Değişken dizisini ayarlamak için capropvar özelliğini kullanın. |
İmzalı bir rasyonel değer. | VT_I8 | Değeri ayarlamak için hVal özelliğini kullanın. Yüksek sözcüğü paydaya, düşük sözcüğü paydaya ayarlayın. |
Rasyonel bir değer. | VT_UI8 | değeri ayarlamak için uhVal özelliğini kullanın. HighPart değerini paydaya, LowPart değerini de paya ayarlayın. LowPart'ın işaretsiz bir int olduğunu unutmayın. İşaret bitinin korunmasını sağlamak için pay, işaretsiz bir int'ten int'e dönüştürülmelidir. |
Dizi öğelerini temsil eden yedekliliği önlemek için güvenli diziler kullanmayın; yalnızca basit diziler kullanın. Bu, bir uygulamanın PROPVARIANT türlerini yorumlarken gerçekleştirmesi gereken çalışmayı azaltır.
mümkün olduğunca VT_BYREF
kullanmaktan ve değerleri satır içinde depolamaktan kaçının.
VT_BYREF
küçük türler için verimsizdir (meta veri öğeleri için ortaktır) ve boyut bilgileri sağlamaz.
PROPVARIANTkullanmadan önce, değeri başlatmak için her zaman PropVariantInit çağırın. PROPVARIANT ile işiniz bittiğinde, değişken için ayrılan belleği serbest bırakmak için her zaman PropVariantClear çağırın.
8BIM İşleyicileri
8BIM meta veri bloğu için meta veri işleyicisi yazarken, hem 8BIM imzasını hem de kimliği kapsülleyen bir imza kullanmanız gerekir. Örneğin, yerel 8BIMIPTC meta veri okuyucusu, okuyucu bulma için aşağıdaki kayıt defteri bilgilerini sağlar:
[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
8BIMIPTC okuyucusu 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04 kayıtlı bir desene sahiptir. İlk dört bayt (0x38, 0x42, 0x49, 0x4D) 8BIM imzasıdır ve son iki bayt (0x04, 0x04) IPTC kaydının kimliğidir.
8BIM çözünürlük bilgilerini okuyacak bir meta veri okuyucu yazmak için 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED şeklinde kayıtlı bir desen gerekecektir. Yine ilk dört bayt (0x38, 0x42, 0x49, 0x4D) 8BIM imzasıdır. Ancak son iki bayt (0x03, 0xED), PSD biçimi tarafından tanımlanan çözüm bilgisi kimliğidir.
İlgili konular
-
kavramsal
-
Nasıl Yapılır: Meta Veri ile JPEG Görüntüsünü Yeniden Kodlama
-
Diğer Kaynaklar
-
WIC-Enabled CODEC Nasıl Yazılır