Aracılığıyla paylaş


IWICBitmapFrameEncode'nin Uygulanması

IWICBitmapFrameEncode

IWICBitmapFrameEncode, IWICBitmapFrameDecode arabirimine karşılık gelen kodlayıcıdır. Bu arabirimi, her çerçeve için görüntü bitlerinin gerçek kodlamasını yapan sınıf olan çerçeve düzeyinde kodlama sınıfınıza uygulayabilirsiniz.

interface IWICBitmapFrameEncode : public IUnknown
{
   // Required methods
   HRESULT Initialize ( IPropertyBag2 *pIEncoderOptions );
   HRESULT SetSize ( UINT width,
               UINT height );
   HRESULT SetResolution ( double dpiX,
               double dpiY );
   HRESULT SetPixelFormat (WICPixelFormatGUID *pPixelFormat);
   HRESULT SetColorContexts ( UINT cCount,
               IWICColorContext **ppIColorContext );
   HRESULT GetMetadataQueryWriter ( IWICMetadataQueryWriter 
               **ppIMetadataQueryWriter );
   HRESULT SetThumbnail ( IWICBitmapSource *pIThumbnail );
   HRESULT WritePixels ( UINT lineCount,
               UINT cbStride,
               UINT cbBufferSize,
               BYTE *pbPixels );
   HRESULT WriteSource ( IWICBitmapSource *pIWICBitmapSource,
               WICRect *prc );
   HRESULT Commit ( void );

// Optional method
   HRESULT SetPalette ( IWICPalette *pIPalette );
};

Başlatmak

Initialize, IWICBitmapFrameEncode nesnesi örneği oluşturulduktan sonra çağrılan ilk yöntemdir. Bu yöntemin null olarak ayarlanabilen bir parametresi vardır. Bu parametre kodlayıcı seçeneklerini temsil eder ve kapsayıcı düzeyinde kod çözücüdeki createNewFrameyönteminde oluşturduğunuz ve bu yöntemin pIEncoderOptions parametresinde çağırana geri aktardığınız IPropertyBag2 örneğiyle aynı. O sırada, IPropertyBag2 yapısını çerçeve düzeyinde kodlayıcınızın desteklediği kodlama seçeneklerini temsil eden özelliklerle doldurdunuz. Çağıran artık belirli kodlama seçeneği parametrelerini göstermek üzere bu özellikler için değerler sağladı ve IWICBitmapFrameEncode nesnesini başlatmak için aynı nesneyi size geri geçiriyor. Görüntü bitlerini kodlarken belirtilen seçenekleri uygulamanız gerekir.

SetSize ve SetResolution

SetSize ve SetResolution açıklayıcıdır. Çağıran, kodlanmış görüntünün boyutunu ve çözünürlüğünü belirtmek için bu yöntemleri kullanır.

SetPixelFormat

SetPixelFormat, görüntünün kodlanacağı bir piksel biçimi istemek için kullanılır. İstenen piksel biçimi desteklenmiyorsa, bir in/out parametresi olan pPixelFormat'de desteklenen en yakın piksel biçiminin GUID değerini döndürmeniz gerekir.

SetColorContexts

SetColorContexts, bu görüntü için bir veya daha fazla geçerli renk bağlamı (renk profilleri olarak da bilinir) belirtmek için kullanılır. Bir görüntüyü daha sonra kodunu çözen bir uygulama, görüntüyü görüntülemek veya yazdırmak için kullanılan cihazın hedef profiline, kaynak renk profilinden dönüştürebilsin diye renk bağlamlarını belirtmek önemlidir. Renk profili olmadan farklı cihazlarda tutarlı renkler elde etmek mümkün değildir. Fotoğrafları farklı monitörlerde farklı göründüğünde ve ekranda gördükleriyle eşleşecek baskıları alamadıklarında bu durum son kullanıcılar için sinir bozucu olabilir.

GetMetadataQueryWriter

GetMetadataQueryWriter, bir uygulamanın görüntü çerçevesindeki bir meta veri bloğuna belirli meta veri özelliklerini eklemek veya düzenlemek için kullanabileceği bir IWICMetadataQueryWriter döndürür.

IWICMetadataQueryWriter, IWICComponentFactory'dan çeşitli şekillerde örnek oluşturabilirsiniz. IWICMetadataBlockWriter, IWICMetadataBlockReader kullanılarak GetMetadataQueryReader yönteminde oluşturulan IWICMetadataQueryReader gibi IWICBitmapFrameDecode arabirimi üzerinde oluşturabilirsiniz.

IWICMetadataQueryWriter* piMetadataQueryWriter = NULL;
HRESULT hr;

hr = m_piComponentFactory->CreateQueryWriterFromBlockWriter( 
      static_cast<IWICMetadataBlockWriter*>(this), 
      &piMetadataQueryWriter);

Ayrıca, önceki yöntem kullanılarak elde edilen IWICMetadataQueryReadergibi mevcut bir IWICMetadataQueryReaderoluşturabilirsiniz.

hr = m_piComponentFactory->CreateQueryWriterFromReader( 
      piMetadataQueryReader, pguidVendor, &piMetadataQueryWriter);

pguidVendor parametresi, bir meta veri yazıcı örneği oluştururken kullanılacak sorgu yazıcısı için belirli bir satıcı belirtmenize olanak tanır. Örneğin, kendi meta veri yazıcılarınızı sağlarsanız, kendi satıcı GUID'nizi belirtmek isteyebilirsiniz. Tercihe sahip değilseniz bu parametreye NULL geçirebilirsiniz.

SetThumbnail

SetThumbnail küçük resim sağlamak için kullanılır. Tüm görüntüler ya genel olarak ya da her karede küçük bir önizleme resmi sağlamalı, veya her iki şekilde de. GetThumbnail ve SetThumbnail yöntemleri kapsayıcı düzeyinde isteğe bağlıdır, ancak codec getThumbnailyöntemindenWINCODEC_ERR_CODECNOTHUMBNAIL döndürürse Windows Görüntüleme Bileşeni (WIC), Çerçeve 0 için GetThumbnail yöntemini çağırır. Her iki yerde de küçük resim bulunamazsa, WIC'nin tam görüntünün kodunu çözmesi ve küçük resim boyutuna ölçeklendirmesi gerekir ve bu da daha büyük görüntüler için büyük bir performans cezasına neden olabilir.

Küçük resim, kodu çözmeyi ve görüntülemeyi hızlı hale getiren bir boyut ve çözünürlükte olmalıdır. Bu nedenle, küçük resimler en yaygın JPEG görüntüleridir. Küçük resimleriniz için JPEG kullanıyorsanız, bunları kodlamak için JPEG kodlayıcı veya kodunu çözmek için JPEG kod çözücü yazmanız gerekmediğini unutmayın. Küçük resimleri kodlamak ve kod çözmek için WIC platformuyla birlikte gelen JPEG codec bileşenine her zaman görev vermeniz gerekir.

WritePixels

WritePixels, kodlama için bellekteki bit eşlemden tarama çizgilerini geçirmek için kullanılan yöntemdir. Tüm tarama çizgileri geçirilene kadar yöntem tekrar tekrar çağrılacaktır. lineCount parametresi, bu çağrıda kaç tarama çizgisi yazılması gerektiğini gösterir. cbStride parametresi tarama çizgisi başına bayt sayısını gösterir. cbBufferSize, kodlanacak gerçek görüntü bitlerini içeren pbPixels parametresinde geçirilen arabelleğin boyutunu gösterir. Kümülatif çağrılardan gelen tarama hatlarının birleşik yüksekliği, SetSize yönteminde belirtilen yükseklikten büyükse, WINCODEC_ERR_TOOMANYSCANLINES döndürün.

WICBitmapEncoderCacheOptionWICBitmapEncoderCacheInMemoryolduğunda, tüm tarama çizgileri geçirilene kadar tarama çizgileri bellekte önbelleğe alınmalıdır. Kodlayıcı önbelleği seçeneği WICBitmapEncoderCacheTempFile ise, tarama satırları nesne başlatılırken oluşturulan geçici bir dosyada önbelleğe alınmalıdır. Bu iki durumda da, çağıran Commitçağırana kadar görüntü kodlanmamalıdır. Önbellek seçeneğinin WICBitmapEncoderNoCacheolması durumunda, mümkünse kodlayıcı tarama çizgilerini alındıklarında kodlamalıdır. (Bazı biçimlerde bu mümkün değildir ve İşleme çağrılana kadar tarama satırları önbelleğe alınmalıdır.)

Ham codec'lerin çoğu WritePixelsuygulamaz çünkü ham dosyadaki görüntü bitlerinin değiştirilmesini desteklemez. Ham codec'ler yine de WritePixels'i uygulamalıdır, çünkü meta veriler eklendiğinde dosyanın boyutunu artırabilir ve bu da dosyanın diskte yeniden yazılmasını gerektirebilir. Bu durumda, WritePixels yönteminin yaptığı gibi mevcut görüntü bitlerini kopyalayabilmek gerekir.

WriteSource

WriteSource, IWICBitmapSource nesnesini kodlamak için kullanılır. İlk parametre, IWICBitmapSource nesnesinin işaretçisidir. İkinci parametre, kodlanabilecek ilgi alanını belirten bir WICRect parametresidir. Her dikdörtgenin genişliği kodlanacak son görüntünün genişliğiyle aynı olduğu sürece, bu yöntem art arda birden çok kez çağrılabilir. Prc parametresinde geçirilen dikdörtgenin genişliği SetSize yönteminde belirtilen genişlikten farklıysa, WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS döndür. Kümülatif çağrılardan tarama hatlarının toplam yüksekliği SetSize metodunda tanımlanan yükseklikten büyükse, WINCODEC_ERR_TOOMANYSCANLINES döndürün.

Önbellek seçenekleri, daha önce açıklanan WritePixels yöntemiyle aynı şekilde çalışır.

Bağlanmak

Commit, kodlanmış görüntü bitlerini dosya akışına seri hale getiren ve çerçeve için tüm meta veri yazıcılarını yineleyerek her birinden meta verilerini akışa seri hale getirmelerini talep eden yöntemdir. Kodlayıcı önbelleği seçeneğinin WICBitmapEncoderCacheInMemory veya WICBitmapEncoderCacheTempFile olması durumunda, bu yöntem görüntüyü kodlamadan da sorumludur ve önbellek seçeneği WICBitmapEncoderCacheTempFile olduğunda, Commit yöntemi kodlamadan önce görüntü verilerini önbelleğe almak için kullanılan geçici dosyayı da silmelidir.

Görüntüyü oluşturan tüm tarama çizgileri veya dikdörtgenler Commit veya WriteSource yöntemi kullanılarak geçirildikten sonra bu yöntem her zaman çağrılır. WritePixels veya WriteSource'a yapılan birikmiş çağrılar aracılığıyla oluşturulan son dikdörtgenin boyutu, SetSize yönteminde belirtilen boyutla aynı boyutta olmalıdır. Boyut beklenen boyutla eşleşmiyorsa, bu yöntem WINCODECERROR_UNEXPECTEDSIZE döndürmelidir.

Meta veri yazıcıları arasında yineleme yapmak ve her meta veri yazıcısına meta verilerini akışa seri hale getirmesini söylemek için, her bloğun yazıcılarında yinelemek amacıyla GetWriterByIndex işlevini çağırın ve her meta veri yazıcısında IWICPersistStream.Save işlemini çağırın.

IWICMetadataWriter* piMetadataWRiter = NULL;
IWICPersistStream* piPersistStream = NULL;
HRESULT hr;

for (UINT x=0; x < m_blockCount; x++) 
{
    hr = GetWriterByIndex(x, & piMetadataWriter);
hr = piMetadataWriter->QueryInterface(
IID_IWICPersistStream,(void**)&piPersistStream);

hr = piPersistStream->Save(m_piStream, 
WICPersistOptions.WicPersistOptionDefault, 
true);
...
}

SetPalette

Yalnızca dizine alınan biçimlere sahip codec'lerin SetPalette yöntemini uygulaması gerekir. Bir görüntü dizinli biçim kullanıyorsa, görüntüde kullanılan renk paletini belirtmek için bu yöntemi kullanın. Codec bileşeniniz dizinli bir biçime sahip değilse bu yöntemden WINCODEC_ERR_PALETTEUNAVAILABLE döndürebilirsiniz.

kavramsal

IWICBitmapCodecProgressNotification (Kodlayıcı) Uygulama

IWICMetadataBlockWriter'ın Uygulanması

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

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