Bagikan melalui


Menerapkan IWICBitmapSourceTransform

IWICBitmapSourceTransform

Meskipun opsional, kami sangat menyarankan agar setiap dekoder mengimplementasikan antarmuka ini pada kelas decoding tingkat bingkai Anda, karena dapat memberikan manfaat performa utama. Ketika aplikasi meminta wilayah tertentu yang menarik, ukuran, orientasi, atau format piksel, alih-alih hanya mendekode seluruh gambar pada resolusi penuh dan kemudian menerapkan transformasi yang diminta, Windows Imaging Component (WIC) memanggil IUnknown::QueryInterface untuk antarmuka ini pada objek IWICBitmapFrameDecode . Jika dekoder bingkai mendukungnya, WIC memanggil metode atau metode yang sesuai untuk menentukan apakah dekoder bingkai dapat melakukan transformasi yang diminta atau menentukan ukuran atau format piksel terdekat yang dapat diberikan dekoder kepada yang diminta. Jika dekoder dapat melakukan transformasi atau transformasi yang diminta, WIC memanggil CopyPixels dengan parameter yang sesuai. Jika dekoder dapat melakukan beberapa, tetapi tidak semua transformasi yang diminta, WIC meminta dekoder untuk melakukan yang dapat dilakukan, dan menggunakan objek transformasi WIC (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotator, dan IWICFormatConverter) untuk melakukan transformasi yang tersisa yang tidak dapat dilakukan oleh dekoder bingkai pada hasil panggilan CopyPixels . Jika dekoder tidak mendukung IWICBitmapSourceTransform, maka WIC harus menggunakan objek transformasi untuk melakukan semua transformasi. Biasanya jauh lebih efisien bagi dekoder untuk melakukan transformasi selama proses pendekodean daripada mendekode seluruh gambar dan kemudian melakukan transformasi. Ini terutama berlaku untuk operasi seperti penskalaan ke ukuran yang jauh lebih kecil atau konversi format piksel.

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);
}

DoesSupportTransform

DoesSupportTransform menanyakan apakah dekoder mendukung operasi rotasi atau membalik yang diminta. WICBitmapTransformOptions yang mungkin diminta adalah:

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

CopyPixels

CopyPixels melakukan pekerjaan aktual untuk mendekode bit gambar, seperti metode CopyPixels pada antarmuka IWICBitmapSource , tetapi metode CopyPixels pada IWICBitmapSourceTransform jauh lebih kuat, dan dapat meningkatkan performa pemrosesan gambar secara signifikan.

Ketika beberapa operasi transformasi diminta, hasilnya tergantung pada urutan operasi dilakukan. Untuk memastikan prediksi dan konsistensi di seluruh codec, penting bahwa semua codec melakukan operasi ini dalam urutan yang sama. Ini adalah urutan kanonis untuk melakukan operasi ini.

  1. Skala
  2. Tanaman
  3. Putar

Konversi format piksel dapat dilakukan kapan saja, karena tidak berpengaruh pada transformasi lain.

Parameter pertama, prcSrc, digunakan untuk menentukan wilayah yang diinginkan untuk mengklip gambar. Karena penskalaan dilakukan sebelum kliping berdasarkan konvensi, jika gambar akan diskalakan serta diklip, wilayah yang diinginkan harus ditentukan setelah gambar diskalakan.

Parameter kedua dan ketiga menunjukkan ukuran untuk menskalakan gambar.

Parameter pguidDstFormat menunjukkan format piksel yang diminta untuk gambar yang didekodekan. Karena WIC telah disebut GetClosestPixelFormat, ini harus menjadi format piksel yang telah ditunjukkan oleh dekoder yang didukungnya.

Parameter dstTransform menunjukkan sudut rotasi yang diminta, dan apakah akan membalik gambar secara vertikal, horizontal, atau keduanya. Sekali lagi, karena WIC akan sudah memanggil DoesSupportTransform, transformasi yang diminta harus salah satu yang telah ditunjukkan oleh dekoder bahwa ia mendukung. Ingat bahwa rotasi harus selalu dilakukan setelah penskalaan dan kliping.

GetClosestSize

GetClosestSize mengambil dua parameter masuk/keluar. Pemanggil menggunakan parameter puiWidth dan puiHeight untuk menentukan ukuran di mana penelepon lebih suka gambar didekodekan. Namun, dekoder dapat mendekode gambar hanya ke ukuran yang merupakan kelipatan ukuran DCT-nya, dan format gambar yang berbeda dapat memiliki ukuran DCT yang berbeda. Dekoder harus menentukan, berdasarkan ukuran DCT-nya sendiri, yang terdekat dapat mencapai ukuran yang diminta, dan mengatur puiWidth dan puiHeight ke dimensi tersebut saat kembali. Jika ukuran yang lebih besar diminta, tetapi codec tidak mendukung peningkatan skala, yang asli harus dikembalikan.

GetClosestPixelFormat

GetClosestPixelFormat digunakan untuk menentukan format piksel terdekat dengan format piksel yang diminta yang dapat disediakan dekoder tanpa kehilangan data. Selalu lebih baik untuk mengonversi ke format piksel yang lebih lebar daripada yang lebih sempit, meskipun akan meningkatkan ukuran gambar, karena selalu dapat dikonversi kembali ke format yang lebih ketat jika perlu. Namun, setelah data hilang, data tidak dapat dipulihkan.

Bacaan Lanjutan

Untuk mempelajari selengkapnya tentang cara membuat codec berkemampuan WIC, lihat Menerapkan IWICDevelopRaw.

Referensi

IWICBitmapSourceTransform

IWICMetadataBlockReader

Konseptual

Menerapkan IWICMetadataBlockReader

Menerapkan IWICDevelopRaw

Cara Menulis codec WIC-Enabled

Gambaran Umum Komponen Pencitraan Windows