Aracılığıyla paylaş


IWICBitmapDecoder Uygulanması

IWICBitmapDecoder

Bir uygulama kod çözücü istediğinde, codec bileşeniyle ilk etkileşim noktası IWICBitmapDecoder arabiriminden geçer. Bu, kapsayıcının en üst düzey özelliklerine ve en önemlisi içerdiği çerçevelere erişim sağlayan kapsayıcı düzeyinde arabirimdir. Bu, kapsayıcı düzeyi kod çözücü sınıfınızdaki birincil arabirimdir.

interface IWICBitmapDecoder : IUnknown
{
// Required methods
   HRESULT QueryCapability (IStream *pIStream, 
      DWORD *pdwCapabilities );
   HRESULT Initialize ( IStream *pIStream,
      WICDecodeOptions cacheOptions );
   HRESULT GetContainerFormat ( GUID *pguidContainerFormat );
   HRESULT GetDecoderInfo ( IWICBitmapDecoderInfo **pIDecoderInfo );
   HRESULT GetFrameCount ( UINT *pCount );
   HRESULT GetFrame ( UINT index, 
      IWICBitmapFrameDecode **ppIBitmapFrame );

// Optional methods
   HRESULT GetPreview ( IWICBitmapSource **ppIPreview );
   HRESULT GetThumbnail ( IWICBitmapSource **ppIThumbnail );
   HRESULT GetColorContexts ( UINT cCount, 
      IWICColorContext **ppIColorContexts, 
      UINT *pcActualCount );
   HRESULT GetMetadataQueryReader ( IWICMetadataQueryReader **ppIMetadataQueryReader);
   HRESULT CopyPalette ( IWICPalette *pIPalette );
}

Bazı görüntü biçimlerinde genel küçük resimler, renk bağlamları veya meta veriler bulunurken, birçok görüntü biçimi bunları yalnızca kare başına sağlar. Bu öğelere erişme yöntemleri IWICBitmapDecoderüzerinde isteğe bağlıdır, ancak IWICBitmapFrameDecodeüzerinde gereklidir. Benzer şekilde, bazı codec'ler dizine alınan piksel biçimlerini kullanmaz ve bu nedenle her iki arabirimde de CopyPalette yöntemlerini uygulaması gerekmez. İsteğe bağlı IWICBitmapDecoder yöntemleri hakkında daha fazla bilgi için, en yaygın olarak uygulandıkları yer olan IWICBitmapFrameDecodebölümüne bakın.

Sorgu Yeteneği

QueryCapability codec seçimi için kullanılan yöntemdir. (Windows Görüntüleme Bileşeni nasıl çalışır konusuna Bulma ve Tahkim bakın). İki codec bileşeni aynı görüntü biçiminin kodunu çözebiliyorsa veya iki codec bileşeninin aynı tanımlayıcı deseni kullandığı bir desen çakışması oluşursa, bu yöntem belirli bir görüntüyü en iyi işleyebilen codec bileşenini seçmenize olanak tanır.

Bu yöntem çağrılırken, Windows Görüntüleme Bileşeni (WIC) görüntüyü içeren gerçek akışı size geçirir. Görüntüdeki her çerçevenin kodunu çözüp çözemeyeceğinizi doğrulamanız ve meta veri blokları arasında numaralandırıp numaralandıramayacağınızı doğrulamanız gerekir. Bu kod çözücü, bu kod çözücüye geçirilen belirli dosya akışıyla ilgili olarak hangi özelliklere sahip olduğunu doğru şekilde bildirir. Bu, tüm kod çözücüler için önemlidir, ancak Etiketli Görüntü Dosya Biçimi (TIFF) kapsayıcılarına dayalı görüntü biçimleri için özellikle önemlidir. Bulma işlemi, kayıt defterindeki kod çözücülerle ilişkili desenleri gerçek görüntü dosyasındaki desenlerle eşleştirerek çalışır. Kayıt defterinde tanımlayıcı deseninizi bildirmek, kod çözücünüzün görüntü biçiminizdeki görüntüler için her zaman algılanacağı garanti eder. Ancak, kod çözücünüz farklı formatlardaki görüntüler için hala algılanabilir. Örneğin, tüm TIFF kapsayıcıları TIFF görüntü biçimi için geçerli bir tanımlayıcı desen olan TIFF desenini içerir. Bu, bulma sırasında, TIFF stili bir kapsayıcıyı temel alan herhangi bir görüntü biçimi için görüntü dosyalarında en az iki tanımlayıcı desen bulunacağı anlamına gelir. Bunlardan biri TIFF deseni, diğeri ise gerçek görüntü biçimi deseni olacaktır. Daha az olası olsa da, diğer ilgisiz görüntü biçimleri arasında da desen çakışmaları olabilir. Bu yüzden keşif ve tahkim iki aşamalı bir süreçtir. QueryCapability'a geçirilen görüntü akışının aslında kendi görüntü biçiminizin geçerli bir örneği olduğunu her zaman doğrulayın. Ayrıca, codec bileşeniniz belirtime sahip olmadığınız bir görüntü biçiminin kodunu çözerse, QueryCapability uygulamanız codec'inizin uygulamadığı görüntü biçimi belirtimi altında geçerli olabilecek herhangi bir özelliğin olup olmadığını denetlemelidir. Bu, kullanıcıların gereksiz kod çözme hataları yaşamamasını veya codec bileşeninizle beklenmeyen sonuçlar almamasını sağlar.

Görüntü üzerinde herhangi bir işlem gerçekleştirmeden önce, akışın geçerli konumunu kaydetmeniz ve yönteme geri dönmeden önce özgün konumuna geri yüklemeniz gerekir. Özellikleri belirten WICBitmapDecoderCapabilities numaralandırması aşağıdaki gibi tanımlanır:

enum WICBitmapDecoderCapabilities
{   
   WICBitmapDecoderCapabilitySameEncoder,
   WICBitmapDecoderCapabilityCanDecodeAllImages,
   WICBitmapDecoderCapabilityCanDecodeSomeImages,
   WICBitmapDecoderCapabilityCanEnumerateMetadata,
   WICBitmapDecoderCapabilityCanDecodeThumbnail
}

Yalnızca görüntüyü sizin kodlayıcınız kodladıysa WICBitmapDecoderCapabilitySameEncoder bildirmeniz gerekir. Kapsayıcıdaki her çerçevenin kodunu çözüp çözmeyeceğinizi doğruladıktan sonra: Çerçevelerin bazılarını ancak hepsini değil yalnızca birkaçını çözebiliyorsanız WICBitmapDecoderCapabilityCanDecodeSomeImages bildirin; tüm çerçeveleri çözebiliyorsanız WICBitmapDecoderCapabilityCanDecodeAllImages bildirin; hiçbirini çözemiyorsanız, hiçbiri bildirilmeyecek. (Bu iki enum birbirini dışlar; eğer WICBitmapDecoderCapabilityCanDecodeAllImagesdöndürürseniz, WICBitmapDecoderCapabilityCanDecodeSomeImages dikkate alınmaz.) Görüntü kapsayıcısındaki meta veri bloklarında numaralandırma yapabileceğinizi doğruladıktan sonra, WICBitmapDecoderCapabilityCanEnumerateMetadata bildirin. Her karede küçük resim olup olmadığını denetlemeniz gerekmez. Küresel bir küçük resim varsa ve bunu çözebiliyorsanız, WICBitmapDecoderCapabilityCanDecodeThumbnailolarak bildirebilirsiniz. Genel küçük resim yoksa, Çerçeve 0 için küçük resmin kodunu çözmeyi dene. Bu yerlerden herhangi birinde küçük resim yoksa, bu özelliği bildirmeyin.

Kod çözücüsünün bu yönteme geçirilen görüntü akışıyla ilgili özelliklerini belirledikten sonra, WICBitmapDecoderCapabilities ile bir OR işlemi gerçekleştirin bu kod çözücüsünün bu görüntüde gerçekleştirebileceğini doğruladınız ve sonucu döndürün. Geri dönmeden önce akışı özgün konumuna geri yüklemeyi unutmayın.

Başlat

Initialize, belirli bir görüntünün kodunu çözmek için bir kod çözücü seçildikten sonra uygulama tarafından çağrılır. Görüntü akışı kod çözücüye geçirilir ve çağıran isteğe bağlı olarak dosyadaki meta verilerle ilgilenmek için WICDecodeOptionsönbellekseçeneğini belirtebilir.

enum WICDecodeOptions
{
   WICDecodeMetadataCacheOnDemand,
   WICDecodeMetadataCacheOnLoad
}

Bazı uygulamalar meta verileri diğerlerinden daha fazla kullanır. Çoğu uygulamanın bir görüntü dosyasındaki tüm meta verilere erişmesi gerekmez ve ihtiyaç duydukları belirli meta verileri talep eder. Diğer uygulamalar, dosya akışını açık tutmak ve meta verilere her erişmeleri gerektiğinde disk G/Ç gerçekleştirmek yerine tüm meta verileri ön planda önbelleğe almalarını tercih eder. Çağıran bir meta veri önbelleği seçeneği belirtmezse, varsayılan önbelleğe alma davranışı isteğe bağlı olarak önbellek olmalıdır. Bu, uygulama bu meta veriler için belirli bir istekte bulunana kadar hiçbir meta verinin belleğe yüklenmemesi gerektiği anlamına gelir. Uygulama WICDecodeMetadataCacheOnLoadbelirtirse, meta veriler hemen belleğe yüklenip önbelleğe alınmalıdır. Meta veriler yükte önbelleğe alındığında, meta veriler önbelleğe alındıktan sonra dosya akışı serbest bırakılabilir.

GetContainerFormat

getContainerFormatuygulamak için, kod çözücü örneğinin oluşturulduğu görüntünün görüntü biçiminin GUID değerini döndürmesi gerekir. Bu yöntem ayrıca IWICMetadataBlockReader ve IWICBitmapEncoderüzerinde de uygulanır.

GetDecoderInfo

GetDecoderInfo bir IWICBitmapDecoderInfo nesnesi döndürür. IWICBitmapDecoderInfo nesnesini almak için kod çözücünüzün GUID'sini IWICImagingFactoryüzerindeki CreateComponentInfo yöntemine geçirmeniz ve ardından aşağıdaki örnekte gösterildiği gibi üzerindeki IWICBitmapDecoderInfo arabirimini istemeniz yeterlidir.

IWICComponentInfo* pComponentInfo = NULL;
HRESULT hr;
 
hr = m_pImagingFactory->CreateComponentInfo(CLSID_This, &pComponentInfo);

hr = pComponentInfo->QueryInterface(IID_IWICBitmapDecoderInfo, (void**)ppIDecoderInfo);

GetFrameCount

GetFrameCountyalnızca kapsayıcıdaki kare sayısını döndürür. Bazı kapsayıcı biçimleri birden çok çerçeveyi, diğerleri ise kapsayıcı başına yalnızca bir çerçeveyi destekler.

GetFrame

GetFrame, IWICBitmapDecoder arabiriminde önemli bir yöntemdir çünkü çerçeve gerçek görüntü bitlerini içerir ve bu yöntemden döndürülen çerçeve kod çözücü nesnesi, istenen görüntünün gerçek kodunu çözme işlemini gerçekleştiren nesnedir. Bu, kod çözücü yazarken uygulamanız gereken diğer nesnedir. Çerçeve kod çözücüleri hakkında daha fazla bilgi için bkz. Implementing IWICBitmapFrameDecode.

GetPreview

GetPreviewgörüntünün önizlemesini döndürür. Önizlemelerin ayrıntılı bir tartışması için, IWICBitmapEncoder uygulama yöntemi ve IWICBitmapEncoder arabirimi üzerine bakın.

Görüntü biçiminiz bir JPEG önizlemesi içeriyorsa, bunun kodunu çözmek için kendi JPEG kod çözücünüzü yazmak yerine, önizlemeleri ve küçük resimlerin kodunu çözmek için WIC platformuyla birlikte gelen JPEG kod çözücüsünü kullanmanız kesinlikle önerilir. Bunu yapmak için akıştaki önizleme görüntüsü verilerinin başlangıcını arayın ve IWICImagingFactoryüzerinde CreateDecoderFromStreamyöntemini çağırın.

IWICBitmapDecoder* pPreviewDecoder = NULL;
IWICBitmapFrameDecode* pPreviewFrame = NULL;
IWICBitmapSource* pPreview = NULL;
HRESULT hr;

hr = m_pImagingFactory->CreateDecoderFromStream(
                               m_pStream, NULL, 
                               WICDecodeMetadataCacheOnDemand, &pPreviewDecoder);
hr = pPreviewDecoder->GetFrame(0, pPreviewFrame);
hr = pPreviewFrame->QueryInterface(IID_IWICBitmapSource, (void**)&pPreview);

Başvuru

IWICBitmapDecoder

IWICBitmapFrameDecode

kavramsal

Kod Çözücü Arabirimleri

IWICBitmapCodecProgressNotification (Kod Çözücü) Uygulamasının Gerçekleştirilmesi

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

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