Aracılığıyla paylaş


IWICBitmapSourceTransform'un Uygulanması

IWICBitmapSourceTransform

İsteğe bağlı olsa da, her kod çözücünün bu arabirimi çerçeve düzeyinde kod çözme sınıfınıza uygulaması önerilir, çünkü önemli performans avantajları sağlayabilir. Bir uygulama yalnızca görüntünün tamamını tam çözünürlükte çözmek ve sonra istenen dönüşümleri uygulamak yerine belirli bir ilgi alanı, boyut, yönlendirme veya piksel biçimi bölgesi istediğinde, Windows Görüntüleme Bileşeni (WIC), IWICBitmapFrameDecode nesnesinde bu arabirim için IUnknown::QueryInterface çağırır. Çerçeve kod çözücü destekliyorsa WIC, çerçeve kod çözücünün istenen dönüşümü gerçekleştirip gerçekleştiremeyeceğini veya kod çözücünün istenene sağlayabilecek en yakın boyut veya piksel biçimini belirlemek için uygun yöntemi veya yöntemleri çağırır. Kod çözücü istenen dönüştürmeyi veya dönüştürmeleri gerçekleştirebiliyorsa, WIC uygun parametrelerleCopyPixelsçağırır. Kod çözücü, istenen dönüştürmelerin bazılarını yerine getirebiliyorsa, ancak hepsini yapamıyorsa, WIC kod çözücüden yapabileceklerini gerçekleştirmesini ister ve ardından WIC dönüşüm nesnelerini (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotator, ve IWICFormatConverter) kullanarak CopyPixels çağrısının sonucunda çerçeve kod çözücü tarafından gerçekleştirilemeyen diğer dönüşümleri tamamlar. Kod çözücü IWICBitmapSourceTransformdesteklemiyorsa, WIC'nin tüm dönüştürmeleri gerçekleştirmek için dönüştürme nesnelerini kullanması gerekir. Kod çözücü için kod çözme işlemi sırasında dönüşüm gerçekleştirmesi genellikle görüntünün tamamının kodunu çözmek ve ardından dönüşümleri gerçekleştirmekten çok daha verimlidir. Bu özellikle çok daha küçük bir boyuta ölçeklendirme veya piksel biçimi dönüştürmeleri gibi işlemler için geçerlidir.

interface IWICBitmapSourceTransform : IUnknown
{
   // Required methods
   HRESULT DoesSupportTransform ( WICTransformOptions dstTransform,
              BOOL *pfIsSupported);
   HRESULT CopyPixels ( WICRect *prcSrc, 
      UINT uiWidth, 
      UINT uiHeight,
      WICPixelFormatGUID * pguidDstFormat,
      WICBitmapTransformOptions dstTransform, 
      UINT nStride, 
      UINT cbBufferSize, 
      BYTE *pbBuffer );

   // Optional methods
   HRESULT GetClosestSize ( UINT *puiWidth,
              UINT *puiHeight);
   HRESULT GetClosestPixelFormat ( WICPixelFormatGUID *pguidDstFormat);
}

DönüşümüDesteklerMi

DoesSupportTransform kod çözücüsü istenen döndürme veya çevirme işlemini destekleyip desteklemediğini sorar. İstenebilecek WICBitmapTransformOptions şunlardır:

enum WICBitmapTransformOptions
{   
   WICBitmapTransformRotate0,
   WICBitmapTransformRotate90,
   WICBitmapTransformRotate180,
   WICBitmapTransformRotate270,
   WICBitmapTransformFlipHorizontal,
   WICBitmapTransformFlipVertical
}

CopyPixels

CopyPixels, IWICBitmapSource arabiriminde CopyPixels yöntemi gibi görüntü bitlerinin kodunu çözme işlemini gerçekleştirir, ancak IWICBitmapSourceTransform üzerinde CopyPixels yöntemi çok daha güçlüdür ve görüntü işleme performansını önemli ölçüde geliştirebilir.

Birden çok dönüştürme işlemi istendiğinde, sonuç işlemlerin gerçekleştirildiği sıraya bağlıdır. Codec bileşenleri arasında öngörülebilirlik ve tutarlılık sağlamak için tüm codec bileşenlerinin bu işlemleri aynı sırada gerçekleştirmesi önemlidir. Bu, bu işlemleri gerçekleştirmek için kurallı düzendir.

  1. Ölçek
  2. Ekin
  3. Döndürmek

Piksel biçimi dönüştürme, diğer dönüşümler üzerinde hiçbir etkisi olmadığından herhangi bir zamanda gerçekleştirilebilir.

İlk parametre olan prcSrc, görüntüyü kırpmak için ilgi çekici bölgeyi belirtmek için kullanılır. Ölçeklendirme, kurala göre kırpmadan önce gerçekleştirildiğinden, görüntünün ölçeklendirilmesi ve kırpılması gerekiyorsa, görüntü ölçeklendirildikten sonra ilgili bölge belirlenmelidir.

İkinci ve üçüncü parametreler, görüntünün ölçeklendirilme boyutunu gösterir.

pguidDstFormat parametresi, kodu çözülen görüntü için istenen piksel biçimini gösterir. WIC zaten GetClosestPixelFormatçağırdığından, bu kod çözücü tarafından desteklendiğini belirttiği bir piksel biçimi olmalıdır.

dstTransform parametresi istenen döndürme açısını ve görüntünün dikey olarak mı, yatay olarak mı yoksa her ikisini birden mi çevireceğini belirtir. WiC, DoesSupportTransformolarak zaten çağrıldığından, istenen dönüştürme kod çözücüsün desteklediğini zaten belirttiği bir dönüştürme olmalıdır. Ölçeklendirme ve kırpma sonrasında döndürmenin her zaman gerçekleştirilmesi gerektiğini unutmayın.

EnYakınBoyutuAl

GetClosestSize iki in/out parametresi alır. Çağıran, görüntünün çözülmesini istediği boyutu belirtmek için puiWidth ve puiHeight parametrelerini kullanır. Ancak kod çözücü, bir görüntünün kodunu yalnızca DCT boyutunun katları olan bir boyuta açabilir ve farklı görüntü biçimleri farklı DCT boyutlarına sahip olabilir. Kod çözücü kendi DCT boyutuna göre istenen boyuta en yakın olan boyutu belirlemeli ve puiWidth ve puiHeight dönüşte bu boyutlara ayarlamalıdır. Daha büyük bir boyut istenirse ancak codec bileşeni yukarı ölçeklendirmeyi desteklemiyorsa özgün boyut döndürülmelidir.

En Yakın Piksel Formatını Al

GetClosestPixelFormat, kod çözücü tarafından veri kaybı olmadan sağlanabilecek istenen piksel biçimine en yakın piksel biçimini belirlemek için kullanılır. Görüntünün boyutunu artıracak olsa da, gerekirse her zaman daha kısıtlayıcı bir biçime geri dönüştürülebileceğinden, daha geniş bir piksel biçimine dönüştürmek her zaman tercih edilir. Ancak veriler kaybolduktan sonra kurtarılamaz.

Okumaya Devam Et

WIC özellikli codec oluşturma hakkında daha fazla bilgi edinmek için bkz. IWICDevelopRaw uygulaması.

Başvuru

IWICBitmapSourceTransform

IWICMetadataBlockReader

kavramsal

IWICMetadataBlockReader'ın Uygulanması

IWICDevelopRaw'ın Uygulanması

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

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