Bu makalemizde bilgisayarımıza bağlı tarayıcıları (scanner) lisleteyeceğiz. Bu tarayıcılara seçilen değerlere göre parametreler göndererek farklı parametrelerle tarayıcıdaki belgenin taranmasını sağ..

Scanner dan Döküman Taratma

Bu makalemizde bilgisayarımıza bağlı tarayıcıları (scanner) lisleteyeceğiz. Bu tarayıcılara seçilen değerlere göre parametreler göndererek farklı parametrelerle tarayıcıdaki belgenin taranmasını sağlayacağız. Bunun için bir windows uygulaması oluşturup formumuzu hazırlayabiliriz. 

Bunun için aşağıdaki isimlerle objelerimizi yerleştirebiliriz.;

  • cmbScanner ComboBox
  • cmbDocumentType ComboBox
  • cmbColorMode ComboBox
  • cmbResolution ComboBox
  • btnScan Button
  • pcbDocument PictureBox 

 

Formumuzun tasarımını yaptıktan sonra tarayıcıyla ilgili kodlarımızı yazmaya başlayabiliriz. Scanner ile ilgili işlem yapabilmemiz için C:\Windows\System32 klasörünün içerisinde bulunan wiaaut.dll ini projemize referans olarak eklememiz gerekiyor. Ardından WIAScanner adında bir class oluşturalım ve tarayıcı ile ilgili kodlarımızı burada yazmaya başlayalım.

Bilgisayarımıza bağlı TWAIN uyumlu tüm  tarayıcıları aşağıdaki kod ile bulabiliriz. 

        public static Dictionary<string, string> GetDevices()
        {
            Dictionary<string, string> devices = new Dictionary<string, string>();
            WIA.DeviceManager manager = new WIA.DeviceManager();
            foreach (WIA.DeviceInfo info in manager.DeviceInfos)
            {
                string deviceId = info.DeviceID;
                string deviceName = FindProperty(info.Properties, 7).get_Value().ToString();
                devices.Add(deviceName,deviceId);
            }
            return devices;
        }

cmbDocumentTypes combobox ının içeriğini aşağıdaki GetDocumentTypes ile dolduracağız. Bu aynı zamanda scanner a göndereceğimiz parametrelerden biri olacak. Döküman tipi ve scanner a göndereceğimiz değerler : 

        public static Dictionary<string, string> GetDocumentTypes()
        {
            Dictionary<string, string> documentTypes = new Dictionary<string, string>();
            documentTypes.Add("BMP", "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}");
            documentTypes.Add("PNG", "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}");
            documentTypes.Add("GIF", "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}");
            documentTypes.Add("JPEG", "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}");
            documentTypes.Add("TIFF", "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}");
            return documentTypes;
        }

cmbResolution combobox ının içeriğini aşağıdaki fonksiyondan dönen değerlerle dolduracağız. 

        public static Dictionary<int, int> GetResolutions()
        {
            Dictionary<int, int> resolutions = new Dictionary<int, int>();
            resolutions.Add(100, 100);
            resolutions.Add(200, 200);
            resolutions.Add(300, 300);
            resolutions.Add(600, 600);
            resolutions.Add(1200, 1200);
            resolutions.Add(2400, 2400);
            return resolutions;
        }

cmbColorModes comboboxımızın içeriğini de aşağıdaki fonksiyondan dolduracağız.

        public static Dictionary<string, string> GetColorModes()
        {
            Dictionary<string, string> colorModes = new Dictionary<string, string>();
            colorModes.Add("Renkli", "1");
            colorModes.Add("Gri Tonlama", "2");
            colorModes.Add("Siyah Beyaz", "4");
            return colorModes;
        }

Seçilen scanner ın parametrelerinin değerlerini aşağıdaki fonksiyon ile bulabiliriz. Scanner ın adı, class Guid gibi bilgilerini bu fonksiyon ile bulabiliriz. 

        public static WIA.Property FindProperty(WIA.Properties properties, int propertyId)
        {
            foreach (WIA.Property property in properties)
                if (property.PropertyID == propertyId)
                    return property;
            return null;
        }

Bu classımızda son olarak scanner a hangi parametreler ile taraması gerektiği bilgileri aşağıdaki fonksiyon ile tanımlamış olacağız. Bu fonksiyon a scanner Id, dosya formatını ve diğer parametreleri göndereceğiz. 

 

        public static List<Image> Scan(string scannerId, string fileFormat, Dictionary<int,string> parameters)
        {
            List<Image> images = new List<Image>();
            bool hasMorePages = true;
            while (hasMorePages)
            {
                // Verilen scanner Id parametresini kullanarak doğru tarayıcıyı seçiyoruz. 
                WIA.DeviceManager manager = new WIA.DeviceManager();
                WIA.Device device = null;
                foreach (WIA.DeviceInfo info in manager.DeviceInfos)
                {
                    if (info.DeviceID == scannerId.ToUpper())
                    {
                        // scanner ile bağlantı kuruluyor. 
                        device = info.Connect();
                        break;
                    }
                }
                // scanner bulunamadı.
                if (device == null)
                {
                    return null;
                }

                WIA.Item item = device.Items[1] as WIA.Item;
                try
                {  //scanner ın tüm özelliklerini dönerek bizim gönderdiğimiz parametreleri bu özelliklere set ediyoruz. 
                    foreach (WIA.Property prop in item.Properties)
                    {
                        object newPropertyValue;
                        string newValue = "";
                        // parameters değişkenimiz Dictionary türünden olduğu için içerisindeki değeri TryGetVaılue ile newValue ya atamasını sağlıyoruz. 
                        if (parameters.TryGetValue(prop.PropertyID, out newValue))
                        { // property ye değeri object türünde atayabileceğimiz için newValue değerini newPropertyValue değerine atadıktan sonra property değerini değiştiriyoruz.. 
                            newPropertyValue = newValue;
                            prop.set_Value(ref newPropertyValue);
                        }

                    }


                    // resmi tarıyoruz.
                    WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog();
                    //resmi hangi formatta tarayacağını belirtiyoruz.
                    WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, fileFormat, true);

                    // Gelen WIA.ImageFile formatındaki resmi temp olarak kaydedip System.Drawing.Image türüyle dosyadan açıyoruz.
                    string fileName = Path.GetTempFileName();
                    File.Delete(fileName);
                    image.SaveFile(fileName);
                    image = null;
                    // Dosyayı Images değişkenimize ekliyoruz. 
                    images.Add(Image.FromFile(fileName));
                }
                catch (Exception exc)
                {
                    return null;
                }
                finally
                { // Bu alanda scanner ın türüne göre scanner ın kağıt beslemesinde başka kağıt var ise kontrolünü yaparak tüm belgeleri taratabiliriz.
                    hasMorePages = false;
                }
            }
            return images;
        }

Artık formumuza dönebiliriz. Combobox ların içeriğini aşağıdaki DataBind fonksiyonu ile doldurabiliriz.

        private void DataBind()
        {
            cmbScanners.DataSource = new BindingSource(WIAScanner.GetDevices(), null);
            cmbScanners.DisplayMember = "Key";
            cmbScanners.ValueMember = "Value";

            cmbDocumentType.DataSource = new BindingSource(WIAScanner.GetDocumentTypes(), null);
            cmbDocumentType.DisplayMember = "Key";
            cmbDocumentType.ValueMember = "Value";

            cmbColorMode.DataSource = new BindingSource(WIAScanner.GetColorModes(), null);
            cmbColorMode.DisplayMember = "Key";
            cmbColorMode.ValueMember = "Value";

            cmbResolution.DataSource = new BindingSource(WIAScanner.GetResolutions(), null);
            cmbResolution.DisplayMember = "Key";
            cmbResolution.ValueMember = "Value";

        }

btnScan butonunun onclick olayına aşağıdaki kodu yazarak tarama işlemini başlatabiliriz.

        private void btnScan_Click(object sender, EventArgs e)
        {
            Dictionary<int, string> parameters = new Dictionary<int, string>();
            // Seçilen Renk Modu Parametresini ekliyoruz. 
            parameters.Add(6146, cmbColorMode.SelectedValue.ToString());
            // Seçilen Çözünürlük değerlerini parametremize ekliyoruz. 
            parameters.Add(6147, cmbResolution.SelectedValue.ToString());
            parameters.Add(6148, cmbResolution.SelectedValue.ToString());
            var ScannedDocument = WIAScanner.Scan(cmbScanners.SelectedValue.ToString(), cmbDocumentType.SelectedValue.ToString(), parameters);
            if (ScannedDocument != null)
            {
                if (ScannedDocument.Count > 0)
                {
                    pcbDocument.Image = ScannedDocument.FirstOrDefault();
                }
            }

        }

InitializeEvents fonksiyonumuz.

        private void InitializeEvents()
        {
            btnScan.Click += btnScan_Click;
        }

Final formumuz oluşturulduğu zaman DataBind ve InitializeEvents fonksiyonlarımızı çağırıyoruz.

        public frmScanners()
        {
            InitializeComponent();
            InitializeEvents();
            DataBind();
        }

Uygulamamız hazır. Çalıştırdığımızda aşağıdaki gibi tarama işlemini gerçekleştirebiliriz.

 

İlgili Makaleler

Bu yazıya 0 yorum yapılmış.

Yorum Gönder