Bagikan melalui


Antarmuka untuk Filter Segmentasi

Dimulai dengan Windows Vista, WIA akan mendukung filter segmentasi. Filter segmentasi harus mengimplementasikan Antarmuka IWiaSegmentationFilter.

Antarmuka IWiaSegmentationFilter tergantung pada antarmuka IWiaItem2 baru (untuk Windows Vista), yang digunakan di seluruh bagian ini, adalah superset dari IWiaItem. Selain metode IWiaItem , antarmuka IWiaItem2 mencakup metode IWiaItem2::GetExtension, yang digunakan oleh aplikasi untuk membuat ekstensi WIA, termasuk filter segmentasi. Antarmuka IWiaItem dan IWiaItem2 dijelaskan dalam dokumentasi Microsoft Windows SDK.

Antarmuka IWiaSegmentationFilter mengimplementasikan satu metode, DetectRegions. Metode ini memiliki tiga parameter, lFlags, pInputStream, dan pWiaItem2.

Parameter lFlags saat ini tidak digunakan.

Parameter pInputStream adalah penunjuk ke gambar tempat segmentasi akan dilakukan. Biasanya ini adalah gambar pratinjau yang mewakili seluruh permukaan pemindaian flatbed. Aliran dibuat oleh aplikasi dalam metode IWiaTransferCallback::GetNextStream ; metode ini dipanggil selama akuisisi gambar. Driver menulis data gambar yang diperoleh ke dalam aliran yang dikembalikan oleh metode IWiaTransferCallback::GetNextStream . Ini juga merupakan aliran yang harus diteruskan ke filter segmentasi oleh aplikasi. Antarmuka IWiaTransferCallback dijelaskan dalam dokumentasi Windows SDK.

Parameter pWiaItem2 adalah penunjuk ke item WIA tempat pInputStream diperoleh. Ini juga disebut sebagai item induk. Misalnya, item yang dituju pWiaItem2 bisa menjadi item flatbed.

Metode IWiaSegmentationFilter::D etectRegions digunakan untuk menentukan subregion gambar yang diwakili oleh pInputStream. Untuk setiap subregion yang terdeteksi, IWiaSegmentationFilter::D etectRegions membuat item WIA anak baru di bawah item yang ditunjukkan oleh pWiaItem2. Untuk setiap item anak, filter segmentasi harus mengatur nilai untuk properti WIA berikut: WIA_IPS_XPOS, WIA_IPS_YPOS, WIA_IPS_XEXTENT, dan WIA_IPS_YEXTENT. Properti ini mewakili persegi panjang batas area untuk dipindai. Filter segmentasi yang lebih canggih mungkin juga ingin mengatur properti WIA lainnya, seperti Properti WIA untuk Filter Segmentasi jika driver mendukung deskewing.

Diagram berikut menunjukkan bagaimana filter segmentasi memodifikasi pohon item aplikasi. Dalam diagram ini, filter segmentasi telah mendeteksi tiga gambar di flatbed, dan, untuk setiap gambar, ia telah membuat item anak baru di bawah item flatbed.

diagram yang mengilustrasikan bagaimana filter segmentasi memodifikasi pohon item aplikasi.

Filter segmentasi harus mendukung semua format gambar yang didukung oleh driver yang diperluasnya. Filter segmentasi yang disediakan Microsoft mendukung format BMP, GIF, JPEG, PNG, dan TIFF. Dengan demikian, driver apa pun yang menggunakan filter ini terbatas pada format ini.

Untuk membuat item anak, filter segmentasi memanggil metode IWiaItem2::CreateChildItem . Berikut ini adalah contoh panggilan seperti itu:

lItemFlags = WiaItemTypeGenerated | WiaItemTypeTransfer | WiaItemTypeImage | WiaItemTypeFile |
 WiaItemTypeProgrammableDataSource;

lCreationFlags = COPY_PARENT_PROPERTY_VALUES;

pWiaItem2->CreateChildItem(lItemFlags,
                           lCreationFlags,
                           bstrItemName,
                           &pChildItem);

IWiaItem2::CreateChildItem sedikit berbeda dari IWiaItem::CreateChildItem. Metode IWiaItem2::CreateChildItem memiliki parameter baru, lCreationFlags; Parameter lItemFlags metode IWiaItem2::CreateChildItem sesuai dengan parameter lFlagsIWiaItem::CreateChildItem. Meneruskan COPY_PARENT_PROPERTY_VALUES dengan parameter lCreationFlags ke layanan WIA, seperti yang ditunjukkan dalam cuplikan kode sebelumnya, memberi tahu layanan WIA untuk mengatur semua properti WIA yang dapat dibaca/ditulis dari item anak ke nilai yang sama dengan induknya. Alasan filter segmentasi harus meneruskan bendera ini adalah untuk memastikan bahwa properti, seperti format gambar dan resolusi dalam item anak yang baru dibuat, adalah sebagai item induk. Penting bahwa resolusinya sama karena properti sejauh mana filter segmentasi akan diatur ke dalam item anak tergantung pada resolusi gambar. Penting juga bahwa format dan resolusi gambar sama dalam item anak jika aplikasi ingin menggunakan komponen pratinjau (dijelaskan dalam dokumentasi Microsoft Windows SDK). Sebelum memperoleh gambar akhir, aplikasi dapat memodifikasi resolusi untuk memperoleh gambar berkualitas lebih tinggi dari pemindai.

Penting untuk dicatat bahwa filter segmentasi terikat oleh batasan yang sama dengan aplikasi dalam apa yang dapat dan tidak dapat dilakukan. Ini berarti bahwa aplikasi dapat memodifikasi item anak yang dibuat filter segmentasi. Misalnya, pengguna mungkin tidak puas dengan wilayah tempat filter segmentasi terdeteksi dan mungkin memberi tahu aplikasi untuk memodifikasi wilayah ini dengan menyeret sudutnya. Aplikasi ini juga dapat menghapus item anak yang dibuat oleh filter segmentasi serta menambahkan item baru.

Perhatikan bahwa filter segmentasi tidak bertanggung jawab untuk "membersihkan" item anak yang dibuatnya. Jadi jika aplikasi memanggil IWiaSegmentationFilter::D etectRegions lebih dari sekali, aplikasi harus terlebih dahulu menghapus item anak yang dibuat dalam panggilan pertama ke metode IWiaSegmentationFilter::D etectRegions . Filter segmentasi juga tidak bertanggung jawab untuk mengatur ulang parameter pInputStream . Aplikasi harus memastikan bahwa aplikasi telah mengatur penunjuk pencarian ke awal aliran sebelum memanggil filter segmentasi.

Filter segmentasi hanya boleh digunakan pada item film dan pada item flatbed. Untuk pemindaian film, pemindai sering dilengkapi dengan bingkai tetap, dalam hal ini driver membuat item anak (silakan merujuk ke WIA Scanner Item Tree Layout untuk informasi lebih lanjut). Dalam hal ini, aplikasi tidak boleh memanggil filter segmentasi untuk deteksi wilayah dan pembuatan item anak.

Jika driver dilengkapi dengan filter segmentasi, itu harus mengimplementasikan properti WIA_IPS_SEGMENTATION untuk item WIA flatbed dan filmnya. Properti baca-saja ini memiliki dua nilai yang valid: WIA_USE_SEGMENTATION_FILTER dan WIA_DONT_USE_SEGMENTATION_FILTER, yang ditetapkan driver. Properti ini memberi tahu aplikasi apakah harus menggunakan filter segmentasi driver untuk deteksi wilayah pada item tertentu.

Jika pemindai menggunakan bingkai tetap untuk pemindaian film, itu akan mengatur properti ini ke WIA_DONT_USE_SEGMENTATION_FILTER dalam item film. Dalam hal ini, aplikasi tidak boleh mencoba memuat filter segmentasi setelah pratinjau film diperoleh; sebaliknya harus menghitung item anak yang dibuat oleh driver. Item anak ini mewakili bingkai tetap.

Karena item WIA diteruskan ke IWiaSegmentationFilter::D etectRegions, dimungkinkan bagi filter segmentasi untuk menggunakan algoritma yang berbeda tergantung pada kategori item, yaitu flatbed atau film. Kategori item disimpan di properti WIA_IPA_ITEM_CATEGORY .

Jika aplikasi mengubah properti apa pun di pWiaItem2 antara memperoleh gambar di pInputStream dan panggilan aplikasi ke IWiaSegmentationFilter::D etectRegions, pengaturan properti asli (yaitu pengaturan properti yang dimiliki item saat aliran diperoleh) harus dipulihkan. Ini dapat dilakukan menggunakan metode IWiaPropertyStorage::GetPropertyStream dan IWiaPropertyStorage::SetPropertyStream . Alasan perubahan ini perlu dipulihkan adalah bahwa mungkin ada informasi dalam item WIA yang diperlukan untuk filter segmentasi, tetapi itu tidak disimpan di header gambar. Contoh informasi tersebut adalah data yang disimpan di properti WIA_IPS_XPOS, WIA_IPS_YPOS, dan WIA_IPS_ROTATION . Antarmuka IWiaPropertyStorage dan metodenya dijelaskan dalam dokumentasi Windows SDK.

Aplikasi mendapatkan instans filter segmentasi dengan memanggil IWiaItem2::GetExtension (dijelaskan dalam dokumentasi Windows SDK). Aplikasi biasanya akan memanggil metode ini sebelum menampilkan jendela pratinjaunya. Ini karena driver mungkin tidak dilengkapi dengan filter segmentasi, dalam hal ini UI harus tahu untuk tidak menampilkan tombol yang tidak didukung, seperti Lakukan Segmentasi.