zoukankan      html  css  js  c++  java
  • WIA设备批量扫描

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using WIA;
    using System.IO;
    using System.Drawing.Imaging;
    using iTextSharp;
    using iTextSharp.text;
    using iTextSharp.text.pdf;
    using System.Drawing.Drawing2D;
    
    namespace printTest
    {
    
        public partial class Form1 : Form
        {
    
    
            List<System.Drawing.Image> images = new List<System.Drawing.Image>();
            public static List<string> GetDevices()
            {
                List<string> devices = new List<string>();
                WIA.DeviceManager manager = new WIA.DeviceManager();
                foreach (WIA.DeviceInfo info in manager.DeviceInfos)
                {
                    devices.Add(info.DeviceID);
                }
                return devices;
            }
    
    
            const string wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";
            class WIA_DPS_DOCUMENT_HANDLING_SELECT
            {
                public const uint FEEDER = 0x00000001;
                public const uint FLATBED = 0x00000002;
            }
            class WIA_DPS_DOCUMENT_HANDLING_STATUS
            {
                public const uint FEED_READY = 0x00000001;
            }
            class WIA_PROPERTIES
            {
                public const uint WIA_RESERVED_FOR_NEW_PROPS = 1024;
                public const uint WIA_DIP_FIRST = 2;
                public const uint WIA_DPA_FIRST = WIA_DIP_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
                public const uint WIA_DPC_FIRST = WIA_DPA_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
                //
                // Scanner only device properties (DPS)
                //
                public const uint WIA_DPS_FIRST = WIA_DPC_FIRST + WIA_RESERVED_FOR_NEW_PROPS;
                public const uint WIA_DPS_DOCUMENT_HANDLING_STATUS = WIA_DPS_FIRST + 13;
                public const uint WIA_DPS_DOCUMENT_HANDLING_SELECT = WIA_DPS_FIRST + 14;
            }
    
            #region 画矩形使用到的变量
            Point p1;   //定义鼠标按下时的坐标点
            Point p2;   //定义移动鼠标时的坐标点
            Point p3;   //定义松开鼠标时的坐标点
            #endregion
    
            #region 缩放、裁剪图像用到的变量
            /// <summary>
            /// 
            /// </summary>
            int x1;     //鼠标按下时横坐标
            int y1;     //鼠标按下时纵坐标
            int width;  //所打开的图像的宽
            int heigth; //所打开的图像的高
            bool HeadImageBool = false;    // 此布尔变量用来判断pictureBox1控件是否有图片
            #endregion
            Bitmap Bi;  //定义位图对像
            public Form1()
            {
                InitializeComponent();
            }
    
            #region 扫描1
            private void btnScan_Click(object sender, EventArgs e)
            {
    
                listBox1.Items.Clear();
                lbDevices.Items.Clear();
                List<string> devices = GetDevices();
    
                foreach (string device in devices)
                {
                    lbDevices.Items.Add(device);
                }
                //check if device is not available
                if (lbDevices.Items.Count == 0)
                {
                    MessageBox.Show("没有任何可用的打印、扫描设备!");
                    this.Close();
                }
                else
                {
                    lbDevices.SelectedIndex = 0;
                }
    
    
                bool hasMorePages = true;
                string deviceID = (string)lbDevices.SelectedItem;
                while (hasMorePages)
                {
                    //select the correct scanner using the provided scannerId parameter
                    WIA.DeviceManager manager = new WIA.DeviceManager();
                    WIA.Device device = null;
                    foreach (WIA.DeviceInfo info in manager.DeviceInfos)
                    {
                        if (info.DeviceID == deviceID)
                        {
                            // connect to scanner
                            device = info.Connect();
                            break;
                        }
                    }
                    // device was not found
                    if (device == null)
                    {
                        // enumerate available devices
                        string availableDevices = "";
                        foreach (WIA.DeviceInfo info in manager.DeviceInfos)
                        {
                            availableDevices += info.DeviceID + "
    ";
                        }
    
                        // show error with available devices
                        throw new Exception("The device with provided ID could not be found. Available Devices:
    " + availableDevices);
                    }
                    int i = device.Items.Count;
                    WIA.Item item = device.Items[1] as WIA.Item;
    
                    try
                    {
                        // scan image
                        WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog();
                        WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false);
    
                        // save to temp file
                        string fileName = Path.GetTempFileName();
                        File.Delete(fileName);
                        image.SaveFile(fileName);//保存temp文件
                        image = null;
                        int leng = @"C:UsersllAppDataLocalTemp".Length;
                        // add file to output list
                        listBox1.Items.Add(fileName.Substring(leng, fileName.Length - leng));
                        //listBox1.Items.Add(fileName);
                        images.Add(System.Drawing.Image.FromFile(fileName));//C:UsersllAppDataLocalTemp
                    }
                    catch (Exception exc)
                    {
                        //MessageBox.Show(exc.Message);
                    }
                    finally
                    {
                        item = null;
                        //determine if there are any more pages waiting
                        WIA.Property documentHandlingSelect = null;
                        WIA.Property documentHandlingStatus = null;
                        foreach (WIA.Property prop in device.Properties)
                        {
                            if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT)
                                documentHandlingSelect = prop;
                            if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS)
                                documentHandlingStatus = prop;
                        }
    
                        // assume there are no more pages
                        hasMorePages = false;
    
                        // may not exist on flatbed scanner but required for feeder
                        if (documentHandlingSelect != null)
                        {
                            // check for document feeder
                            if ((Convert.ToUInt32(documentHandlingSelect.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0)
                            {
                                hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) != 0);
                            }
                        }
                    }
                }
                if (images.Count >= 0)
                {
                    pictureBox1.Image = images[0];
                    double imageX = pictureBox1.Image.Width;
                    double imageY = pictureBox1.Image.Height;
    
                    double picX = pictureBox1.Width;
                    double pixY = pictureBox1.Height;
    
                    //pictureBox2.Image = images[0];
                    //pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
                }
            } 
            #endregion
    
            #region 保存
            private void button1_Click(object sender, EventArgs e)
            {
                if (pictureBox2.Image != null)
                {
                    string where = @"E:" + DateTime.Now.ToString("yyyy-MM-dd HHmmss");
                    //save scanned image into specific folder
                    pictureBox2.Image.Save(where + ".jpeg", ImageFormat.Jpeg);
    
            //        //iTextSharp.text.Rectangle pageSize = new iTextSharp.text.Rectangle(216f, 716f);
            //        iTextSharp.text.Rectangle pageSize = new iTextSharp.text.Rectangle(216f, 716f);
            //        pageSize.BackgroundColor = new iTextSharp.text.BaseColor(0xFF, 0xFF, 0xDE);
            //        iTextSharp.text.Image img1 = iTextSharp.text.Image.GetInstance(pictureBox1.Image, iTextSharp.text.BaseColor.WHITE);
            //        //设置边界
            //        //Document document = new Document(pageSize, 36f, 72f, 108f, 180f);
            //        Document document = new Document(pageSize, 36f, 72f, 108f, 180f);
            //        PdfWriter.GetInstance(document, new FileStream(where + ".pdf", FileMode.Create));
            //        // 添加文档信息
            //        document.AddTitle("PDFInfo");
            //        document.AddSubject("Demo of PDFInfo");
            //        document.AddKeywords("Info, PDF, Demo");
            //        document.AddCreator("SetPdfInfoDemo");
            //        document.AddAuthor("zeda");
            //        document.Open();
            //        // 添加文档内容
            //        document.Add(img1);
            //        document.Close();
                }
            } 
            #endregion
    
            #region 顺时针旋转
            private void button4_Click(object sender, EventArgs e)
            {
                if (pictureBox1.Image != null)
                {
                    try
                    {
                        Bitmap a = new Bitmap(pictureBox1.Image);//得到图片框中的图片
                        pictureBox1.Image = Rotate(a, 90);
                        //pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
                        pictureBox1.Location = panel1.Location;
                        pictureBox1.Refresh();//最后刷新图片框
                    }
                    catch { }
                }
            }
            #endregion
    
            #region 扫描4
            private void button5_Click(object sender, EventArgs e)
            {
                ImageFile imageFile = null;
                CommonDialogClass cdc = new WIA.CommonDialogClass();
    
                try
                {
                    imageFile = cdc.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType,
                                                     WIA.WiaImageIntent.TextIntent,
                                                     WIA.WiaImageBias.MaximizeQuality,
                                                     "{00000000-0000-0000-0000-000000000000}",
                                                     true,
                                                     true,
                                                     false);
    
                    string fileName = Path.GetTempFileName();
                    File.Delete(fileName);
                    if (imageFile != null)
                    {
                        imageFile.SaveFile(fileName);//保存temp文件
                        imageFile = null;
                        int leng = @"C:UsersllAppDataLocalTemp".Length;
                        // add file to output list
                        listBox1.Items.Add(fileName.Substring(leng, fileName.Length - leng));
                        //listBox1.Items.Add(fileName);
                        images.Add(System.Drawing.Image.FromFile(fileName));//C:UsersllAppDataLocalTemp
                        foreach (System.Drawing.Image im in images)
                        {
                            string where = @"E:" + DateTime.Now.ToString("yyyy-MM-dd HHmmss");
                            //save scanned image into specific folder
                            im.Save(where + ".jpeg", ImageFormat.Jpeg);
                        }
                    }
                }
                catch (System.Runtime.InteropServices.COMException)
                {
                    imageFile = null;
                }
            }
            #endregion
            int i = 0;
            #region 增加
            private void button2_Click(object sender, EventArgs e)
            {
                i++;
                label1.Text = i.ToString();
                if (i < images.Count && i >= 0)
                {
                    pictureBox1.Image = images[i];
                    //pictureBox2.Image = images[i];
                    //pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
                }
            } 
            #endregion
    
            #region 减小
            private void button3_Click(object sender, EventArgs e)
            {
                i--;
                label1.Text = i.ToString();
                if (i < images.Count && i >= 0)
                {
                    pictureBox1.Image = images[i];
                    //pictureBox2.Image = images[i];
                    //pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
                }
            } 
            #endregion
    
            #region 旋转
            private void button6_Click(object sender, EventArgs e)
            {
                if (pictureBox1.Image != null)
                {
                    try
                    {
                        Bitmap a = new Bitmap(pictureBox1.Image);//得到图片框中的图片
                        pictureBox1.Image = Rotate(a, -90);
                        //pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
                        pictureBox1.Location = panel1.Location;
                        pictureBox1.Refresh();//最后刷新图片框
                    }
                    catch { }
                }
            } 
            #endregion
    
    
            #region 图片旋转函数
            /// <summary>
            /// 以逆时针为方向对图像进行旋转
            /// </summary>
            /// <param name="b">位图流</param>
            /// <param name="angle">旋转角度[0,360](前台给的)</param>
            /// <returns></returns>
            public Bitmap Rotate(Bitmap b, int angle)
            {
                angle = angle % 360;
     
                //弧度转换
                double radian = angle * Math.PI / 180.0;
                double cos = Math.Cos(radian);
                double sin = Math.Sin(radian);
     
                //原图的宽和高
                int w = b.Width;
                int h = b.Height;
                int W = (int)(Math.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin)));
                int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos)));
     
                //目标位图
                Bitmap dsImage = new Bitmap(W, H);
                Graphics g = Graphics.FromImage(dsImage);            
     
                g.InterpolationMode = InterpolationMode.Bilinear;
     
                g.SmoothingMode = SmoothingMode.HighQuality;
     
                //计算偏移量
                Point Offset = new Point((W - w) / 2, (H - h) / 2);
     
                //构造图像显示区域:让图像的中心与窗口的中心点一致
                 System.Drawing.Rectangle rect = new  System.Drawing.Rectangle(Offset.X, Offset.Y, w, h);
                Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
                g.TranslateTransform(center.X, center.Y);
                g.RotateTransform(360 - angle);
     
                //恢复图像在水平和垂直方向的平移
                g.TranslateTransform(-center.X, -center.Y);
                g.DrawImage(b, rect);
     
                //重至绘图的所有变换
                g.ResetTransform();
     
                g.Save();
                g.Dispose();
                return dsImage;
            }
            #endregion 图片旋转函数更多 0
    
            private void Form1_Load(object sender, EventArgs e)
            {
                #region 滚动条
                panel2.AutoScroll = true;
                pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
    
                panel3.AutoScroll = true;
                pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; 
    
                #endregion
    
    
                #region 自动缩放
                //pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
                //pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
    
    
                //pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
                //pictureBox2.Dock = System.Windows.Forms.DockStyle.Fill; 
                #endregion
            }
    
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                this.Cursor = Cursors.Cross;
                this.p1 = new Point(e.X, e.Y);
                x1 = e.X;
                y1 = e.Y;
                if (this.pictureBox1.Image != null)
                {
                    HeadImageBool = true;
                }
                else
                {
                    HeadImageBool = false;
                }
            }
    
            #region 移动鼠标发生的事件
            /// <summary>
            /// 鼠标移动事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (this.Cursor == Cursors.Cross)
                {
                    this.p2 = new Point(e.X, e.Y);
                    if ((p2.X - p1.X) > 0 && (p2.Y - p1.Y) > 0)     //当鼠标从左上角向开始移动时P3坐标
                    {
                        this.p3 = new Point(p1.X, p1.Y);
                    }
                    if ((p2.X - p1.X) < 0 && (p2.Y - p1.Y) > 0)     //当鼠标从右上角向左下方向开始移动时P3坐标
                    {
                        this.p3 = new Point(p2.X, p1.Y);
                    }
                    if ((p2.X - p1.X) > 0 && (p2.Y - p1.Y) < 0)     //当鼠标从左下角向上开始移动时P3坐标
                    {
                        this.p3 = new Point(p1.X, p2.Y);
                    }
                    if ((p2.X - p1.X) < 0 && (p2.Y - p1.Y) < 0)     //当鼠标从右下角向左方向上开始移动时P3坐标
                    {
                        this.p3 = new Point(p2.X, p2.Y);
                    }
                    this.pictureBox1.Invalidate();  //使控件的整个图面无效,并导致重绘控件
                }
            }
            #endregion
    
    
            #region 松开鼠标发生的事件,实例化ImageCut1类对像
            ImageCut1 IC1;  //定义所画矩形的图像对像
            /// <summary>
            /// 鼠标放开事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
            {
                if (HeadImageBool)
                {
                    width = this.pictureBox1.Image.Width;
                    heigth = this.pictureBox1.Image.Height;
                    if ((e.X - x1) > 0 && (e.Y - y1) > 0)   //当鼠标从左上角向右下方向开始移动时发生
                    {
                        IC1 = new ImageCut1(x1, y1, Math.Abs(e.X - x1), Math.Abs(e.Y - y1));    //实例化ImageCut1类
                    }
                    if ((e.X - x1) < 0 && (e.Y - y1) > 0)   //当鼠标从右上角向左下方向开始移动时发生
                    {
                        IC1 = new ImageCut1(e.X, y1, Math.Abs(e.X - x1), Math.Abs(e.Y - y1));   //实例化ImageCut1类
                    }
                    if ((e.X - x1) > 0 && (e.Y - y1) < 0)   //当鼠标从左下角向右上方向开始移动时发生
                    {
                        IC1 = new ImageCut1(x1, e.Y, Math.Abs(e.X - x1), Math.Abs(e.Y - y1));   //实例化ImageCut1类
                    }
                    if ((e.X - x1) < 0 && (e.Y - y1) < 0)   //当鼠标从右下角向左上方向开始移动时发生
                    {
                        IC1 = new ImageCut1(e.X, e.Y, Math.Abs(e.X - x1), Math.Abs(e.Y - y1));      //实例化ImageCut1类
                    }
    
                    if (IC1 != null)
                    {
                        this.pictureBox2.Width = (IC1.KiCut1((Bitmap)(this.pictureBox1.Image))).Width;
                        this.pictureBox2.Height = (IC1.KiCut1((Bitmap)(this.pictureBox1.Image))).Height;
                        this.pictureBox2.Image = IC1.KiCut1((Bitmap)(this.pictureBox1.Image));
    
                        //this.pictureBox2.Image = IC1.KiCut1((Bitmap)(this.pictureBox1.Image));
                        //boolShow1 = true;
                        //else if (pictureBox3.Image == null)
                        //{
                        //    this.pictureBox3.Image = IC1.KiCut1((Bitmap)(this.pictureBox1.Image));
                        //    boolShow2 = true;
                        //}
                        //else
                        //{
                        //    if (boolShow2 == true)
                        //    {
                        //        this.pictureBox2.Image = IC1.KiCut1((Bitmap)(this.pictureBox1.Image));
                        //        boolShow1 = true;
                        //        boolShow2 = false;
                        //    }
                        //    else
                        //    {
                        //        this.pictureBox3.Image = IC1.KiCut1((Bitmap)(this.pictureBox1.Image));
                        //        boolShow1 = false;
                        //        boolShow2 = true;
                        //    }
                        //}
                    }
                    this.Cursor = Cursors.Default;
                }
                else
                {
                    this.Cursor = Cursors.Default;
                }
            }
            #endregion
    
    
            #region 重新绘制pictureBox1控件,即移动鼠标画矩形
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                if (HeadImageBool)
                {
                    Pen p = new Pen(Color.Black, 1);//画笔
                    p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
                    //Bitmap bitmap = new Bitmap(strHeadImagePath);
                    Bitmap bitmap = Bi;
                    System.Drawing.Rectangle rect = new System.Drawing.Rectangle(p3, new Size(System.Math.Abs(p2.X - p1.X), System.Math.Abs(p2.Y - p1.Y)));
                    e.Graphics.DrawRectangle(p, rect);
    
                }
                else
                {
                }
            }
            #endregion
    
            private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                //string fileName = DateTime.Now.ToString("yyyyMMddhhmmss");
                //string path = Path.GetFullPath("images/");
                //string[] files = Directory.GetFiles(path);
                //foreach (string file in files)
                //{
                //    if (file == path + fileName + ".jpg")
                //    {
                //        return;
                //    }
    
                //}
                //using (Stream stream = new FileStream(path + fileName + ".jpg", FileMode.Create))
                //{
                //    using (FileStream fs = new FileStream(listBox1.SelectedItem.ToString(), FileMode.Open))
                //    {
                //        byte[] bytes = new byte[1024 * 10];
                //        int len;
                //        while ((len = fs.Read(bytes, 0, bytes.Length)) > 0)
                //        {
                //            stream.Write(bytes, 0, len);
    
                //        }
                //    }
                //}
                //System.Drawing.Image image = System.Drawing.Image.FromFile(path + fileName + ".jpg");
                //pictureBox1.Image = image;
            }
    
           
        }
    }

  • 相关阅读:
    IDEA在编辑时提示could not autowire
    python基础——使用__slots__
    python基础——实例属性和类属性
    python基础——继承和多态
    python基础——访问限制
    python基础——面向对象编程
    python基础——第三方模块
    python基础——使用模块
    python基础——模块
    Python tkinter调整元件在窗口中的位置与几何布局管理
  • 原文地址:https://www.cnblogs.com/hongmaju/p/4686281.html
Copyright © 2011-2022 走看看