Aracılığıyla paylaş


IWICMetadataBlockReader'ı Uygulama

IWICMetadataBlockReader

Genellikle bir görüntüde birden çok meta veri bloğu bulunur ve her biri farklı biçimlerde farklı bilgi türlerini gösterir. Windows Görüntüleme Bileşeni (WIC) modelinde meta veri işleyicileri, kod çözücüler gibi çalışma zamanında bulunabilen ayrı bileşenlerdir. Her meta veri biçiminin ayrı bir işleyicisi vardır ve bu meta veri işleyicilerinin her biri, işlediği meta veri biçimini destekleyen herhangi bir görüntü biçimiyle kullanılabilir. Bu nedenle, görüntü biçiminiz EXIF, XMP, IPTC veya başka bir biçimi destekliyorsa, WIC ile birlikte gelen bu biçimler için standart meta veri işleyicilerinden yararlanabilirsiniz ve kendi biçiminizi yazmanız gerekmez. Tabii ki, yeni bir meta veri biçimi oluşturursanız, bunun için bir meta veri işleyicisi yazmanız gerekir. Bu işleyici, standart olanlarla aynı çalışma zamanında bulunur ve çağrılır.

Not

Görüntü biçiminiz Etiketli Görüntü Dosya Biçimi 'ni (TIFF) veya JPEG kapsayıcısını temel alıyorsa, herhangi bir meta veri işleyicisi yazmanız gerekmez (yeni veya özel bir meta veri biçimi geliştirmediğiniz sürece). TIFF ve JPEG kapsayıcılarında meta veri blokları IFD'lerin içinde bulunur ve her kapsayıcının farklı bir IFD yapısı vardır. WIC, IFD yapısını gezerek içindeki metaverilere erişmek için standart metaveri işleyicilerine devreden bu kapsayıcı biçimlerinin her ikisi için IFD işleyicileri sağlar. Bu nedenle, görüntü biçiminiz bu kapsayıcılardan birini temel alıyorsa WIC IFD işleyicilerinden otomatik olarak yararlanabilirsiniz. Ancak, kendi benzersiz üst düzey meta veri yapısına sahip özel bir kapsayıcı biçiminiz varsa, ifD işleyicilerinin yaptığı gibi bu üst düzey yapıda gezinebilen ve uygun meta veri işleyicilerine temsilci atayabilen bir işleyici yazmanız gerekir.)

 

WIC, uygulamalar için tutarlı bir arabirim kümesi aracılığıyla tüm görüntü biçimleriyle aynı şekilde çalışmalarına olanak tanıyan bir soyutlama katmanı sağlarken, WIC de codec yazarları için meta veri biçimleriyle ilgili bir soyutlama katmanı sağlar. Daha önce belirtildiği gibi, codec yazarlarının genellikle bir görüntüde mevcut olabilecek çeşitli meta veri biçimleriyle doğrudan çalışması gerekmez. Ancak her codec yazarı, her bir blok için uygun meta veri işleyicisinin bulunabilmesi ve örneklenmesi için meta veri bloklarını listelemek için bir yol sağlamaktan sorumludur.

Bu arabirimi çerçeve düzeyinde kod çözme sınıfınızda uygulamanız gerekir. Görüntü formatınız, herhangi bir bireysel görüntü karesinin dışında genel meta verilerini açığa çıkarıyorsa, kapsayıcı düzeyindeki kod çözücü sınıfınızda da uygulamanız gerekebilir.

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, IWICBitmapDecoder uygulamaüzerindeki GetContainerFormat yöntemiyle aynıdır.

GetCount

GetCount, çerçeveyle ilişkili üst düzey meta veri bloklarının sayısını döndürür.

GetEnumerator

getEnumerator, çağıranın çerçevedeki meta veri blokları üzerinde numaralandırma yapması ve meta verilerini okuması için kullanabileceği bir numaralandırıcı döndürür. Bu yöntemi uygulamak için her meta veri bloğu için bir meta veri okuyucu oluşturmanız ve meta veri okuyucu koleksiyonu üzerinde numaralandıran bir numaralandırma nesnesi uygulamanız gerekir. Sabit listesi nesnesinin IEnumUnknown uygulaması gerekir, böylece bunu ppIEnumMetadata parametresinde döndürerek IEnumUnknown'a dönüştürebilirsiniz.

Numaralandırma nesnesini uygularken, IWICMetadataBlockReader nesnesini ilk oluşturduğunuzda veya numaralandırma nesnesini ilk oluşturduğunuzda tüm meta veri okuyucularını oluşturabilir veya bunları IEnumUnknown::Next yönteminin uygulamasında rahatça oluşturabilirsiniz. Çoğu durumda, bunları gevşek bir şekilde oluşturmak daha verimlidir, ancak aşağıdaki örnekte blok okuyucuların tümü oluşturucuda yer kazanmak için oluşturulur.

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
    ...
}

Meta veri okuyucuları oluşturmak için CreateMetadataReaderFromContaineryöntemini kullanırsınız. Bu yöntemi çağırırken, guidContainerFormat parametresinde kapsayıcı biçiminin GUID'sini geçirirsiniz. Meta veri okuyucusu için satıcı tercihiniz varsa, tercih ettiğiniz satıcının GUID değerini pGuidVendor parametresinde geçirebilirsiniz. Örneğin, şirketiniz meta veri işleyicileri yazıyorsa ve kendi meta veri işleyicilerinizi kullanmak istiyorsanız, mevcutsa satıcıya ait GUID'nizi geçirebilirsiniz. Çoğu durumda, NULLgeçirir ve sistemin uygun meta veri okuyucuyu seçmesine izin verirsiniz. Belirli bir satıcıya istekte bulunursanız ve bu satıcının bilgisayarda yüklü bir meta veri okuyucusu varsa, WIC bu satıcının okuyucusunu döndürür. Ancak, istenen satıcının bilgisayarda yüklü bir meta veri okuyucusu yoksa ve kullanılabilir uygun bir meta veri okuyucusu varsa, tercih edilen satıcıdan olmasa bile bu okuyucu döndürülür. Bloktaki meta veri türü için bilgisayarda meta veri okuyucusu yoksa, bileşen fabrikası meta veri bloğunu ikili büyük nesne (BLOB) olarak ele alan Bilinmeyen Meta Veri İşleyicisi'ni döndürür ve ayrıştırma girişiminde bulunmadan dosyadaki meta veri bloğunu seri durumdan kaldırır.

dwOptions parametresi için, uygun WICPersistOptions ile uygun WICMetadataCreationOptionsarasında bir OR işlemi gerçekleştirin. WICPersistOptions, kapsayıcınızın nasıl düzenleneceğini açıklar. Little-endian varsayılandır.

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

WICMetadataCreationOptions, makinede belirli bir bloğun meta veri biçimini okuyabilen bir meta veri okuyucu bulunamazsa UnknownMetadataHandler'ı geri almak isteyip istemediğinizi belirtir. WICMetadataCreationAllowUnknown varsayılandır ve UnknownMetadtataHandler'ın oluşturulmasına her zaman izin vermelisiniz. UnknownMetadataHandler tanınmayan meta verileri BLOB olarak kabul eder. Ayrıştıramaz, ancak blob olarak akışa yazar ve kodlama sırasında akışa geri yazıldığında olduğu gibi kalır. Bu, sistemle birlikte göndermeyen özel meta veriler veya meta veri biçimleri için meta veri işleyicileri oluşturmayı güvenli hale getirir. Meta veriler olduğu gibi korunduğundan, bunu tanıyan bilgisayarda işleyici olmasa bile, uygun bir meta veri işleyicisi daha sonra yüklendiğinde meta veriler yine orada olur ve okunabilir. Bilinmeyen Meta Veri İşleyicisinin oluşturulmasına izin vermezseniz, alternatif olarak tanınmayan meta verileri yok etmek veya üzerine yazmak seçeneklerini düşünmelisiniz. Bu bir veri kaybı biçimidir.

Not

Özel meta veriler için kendi meta veri işleyicinizi yazarsanız, meta veri bloğunun dışında hiçbir şeye başvuru eklememelisiniz. UnknownMetadataHandler meta verileri olduğu gibi korusa da, dosyalar düzenlendiğinde meta veriler taşınır ve bu durumda kendi bloğu dışındaki herhangi bir şeye yapılan başvurular artık geçerli olmaz.

 

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

pIStream parametresi, kodunu çözdüğünüz gerçek akıştır. Akışı geçirmeden önce, okuyucu isteğinde bulunmak istediğiniz meta veri bloğunun başlangıcını aramalısınız. İlgili meta veri bloğu için uygun meta veri okuyucusu, IStream geçerli konumundaki meta veri bloğunda ppiReader parametresine geri döndürülür.

GetReaderByIndex

GetReaderByIndex, koleksiyonda istenen dizinde meta veri okuyucuyu döndürür.

Başvuru

IWICMetadataBlockReader

kavramsal

IWICBitmapFrameDecode Uygulaması

IWICBitmapSourceTransform Uygulama

WIC-Enabled CODEC Nasıl Yazılır

Windows Görüntüleme Bileşenine Genel Bakış