C#调用TWAIN使用Kodak组件获取扫描仪图片数据

其中一种就是微软官方推出的WIA接口调用扫描仪,这种方式是目前最新的。其实这种方式很容易编写,

只不过它内部不会存储用户需要扫描的分辨率等信息,不过这种方法在与方便快捷,直接安装WIA控件到

Windows,直接在C#代码中编写就可以直接调用,不用自己编辑控件的属性等,很方便易用。

另外一种方式就是传统的TWIAN,因为很多扫描仪厂家都墨守陈规的遵循了TWAIN的潜规则,所以这种方法

也是得到了很多编程爱好者的欢迎,这个接口可以直接调用扫描仪厂家已经编写好的扫描窗口,可以实现在驱

动层获取到图片信息,而且这种方法的好处就是可以批量扫描,添加Kodak扫描控件后,也可以实现批量扫描

的功能,而且还提供图片编辑等功能。

Kodak方法所需要的系统组件: 
imgadmin.ocx      imgcmn.dll          imgedit.ocx       imgscan.ocx        xiffr3_0.dll
imgshl.dll        imgthumb.ocx        imm32.dll         jpeg1x32.dll       tifflt.dll
jpeg2x32.dll      oieng400.dll        oiprt400.dll      oislb400.dll       oiui400.dll
oissq400.dll      oitwa400.dll        Run Kodak.bat
      真正要用到的空间只有两个。不过,在扫描过程中,为了保证图片的编辑以及其他的操作不受影响,建议全部

安装,运行Run Kodak.bat注册所有的组件。

在Kodak的扫描组件中,我们需要的是imgscan.ocx、imgadmin.ocx、imgedit.ocx三个为主要的控件,其中

imgscan.ocx为Kodak的主要扫描组件。

所有的扫描组件都安装完毕之后,接下来就是在C#中添加扫描组件的调用,操作、获取扫描仪中的数据

。在项目工程中,添加WIA引用以及Kodak组件的应用,Kodak属于工具类,所以在工具箱中还需要添加Kodak组

件工具。

使用Kodak扫描,需要拖放Kodak扫描控件到窗口程序中
添加Kodak的命名空间:

using ScanLibCtl;

下面是在button时间中的代码:

SealPicture.Image = null;
            string paths =@"E:\img";
            try
            {
                File.Delete(paths);
            }
            catch { }
            int ll_rtn = axImgScan.OpenScanner(); //打开扫描仪
            if (ll_rtn == 0)
            {
                if (axImgScan.ScannerAvailable() == true)//判断扫描仪是否可用
                {
                    axImgScan.MultiPage = true;//是否多页
                    axImgScan.PageCount = axImgScan.PageCount + 1;
                    axImgScan.Image = paths;
                    axImgScan.FileType = ScanLibCtl.FileTypeConstants.TIFF;//设置文件类型
                    axImgScan.CompressionType = CompressionTypeConstants.JPEG;
                    axImgScan.ScanTo = ScanToConstants.FileOnly;
                    axImgScan.SetPageTypeCompressionOpts(CompPreferenceConstants.GoodDisplay,ImageTypeConstants.ColorPal4Bit, CompTypeConstants.JPEGCompression,CompInfoConstants.JPEGHighHigh);//.G31DFaxRBO);
                    axImgScan.StopScanBox = false;
                    axImgScan.ShowSetupBeforeScan = true;//是否在扫描前显示设置界面
                    axImgScan.Show();
                    ll_rtn = axImgScan.StartScan();//开始扫描
                    //以文件流的形式读取图片文件并释放,以便下一次扫面前删除文件
                    try
                    {
                        FileStream Files = new FileStream(paths, FileMode.Open);
                        Image Picture = Image.FromStream(Files);
                        SealPicture.Image = Picture;
                        Files.Close();
                    }
                    catch { }
                    if (ll_rtn == 9254 || ll_rtn == 0) { }
                    else
                    {
                        MessageBox.Show("扫描仪没有正确连接或扫描控件已破坏,请检查!", "系统提示...", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    }
                    axImgScan.CloseScanner(); //关闭扫描仪
                }
                else
                {
                    MessageBox.Show("扫描仪没有正确连接,请重新设置!", "系统提示...",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            else if (ll_rtn == 9219)
            {
                MessageBox.Show("系统没有安装扫描仪或扫描仪没有正确连接!", "系统提示...",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

完成这些代码的编写,也就可以完成了通过调用WIA与Kodak两个扫描组件对扫描议的调用,获取扫描仪中

的图片数据。

下面是项目代码中的截图:

时间: 2024-10-09 09:43:32

C#调用TWAIN使用Kodak组件获取扫描仪图片数据的相关文章

android 获取本地图片(一)

我的前面几个博文中已经介绍过了如何获取本地图片和Bitmap.软引用.弱引用的使用方法.在这两个博文当中针对一个完整的Demo示例给大家讲解获取本地图片的非常有效.也是安卓官方推荐的方法. **源代码在博文最后可以下载**. 不知道怎么回事,近来csdn写博文上传图片错误,不能上传图片,所以给不了大家效果图.我就文字介绍好了.整个Demo只有一个Activity中完成,加载本地图片在GridView中进行显示,同时点击每个图片可以对图片进行选中的操作,每个item图片右上角会给出对号的提示,表示

android获取拍照图片、本地图片简单实现!

在安卓应用开发中经常会用到调用系统相机拍照跟获取本地图片功能,下面就是对这一常用功能的简单实现Demo! 在获取拍照图片功能中要加上这两权限. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> 布局文件 1 <Re

UIImagePickerController(获取相册图片,打开相机)

UIImagePickerController的使用一定要在controller中,因为需要弹出控制器,如果不是在controller中,则可以通过响应者链查找获得controller,也可以通过代理方法回调 //本文查看地址http://write.blog.csdn.net/postedit - (IBAction)pickPhotoLibrary:(id)sender { if (_imagePicker == nil) { _imagePicker = [[UIImagePickerCo

window2008 64位系统无法调用Microsoft.Office.Interop组件进行文件另存的解决办法

服务器是windows server2008 64位系统,项目中需要用到Microsoft.Office.Interop组件,包括excel.word.ppt等. 重点一: 步骤 1.在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 2.依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置" 3.在"

Unity3D杂烩:位置修改,子对象获取,组件获取,通过脚本文件获取被绑定对象

//位置修改 player.transform.position = new Vector3( Camera.main.transform.position.x, Camera.main.transform.position.y+3);  player.GetComponent<Rigidbody2D> ().velocity = new Vector2 (0,0);  player.transform.localRotation = Quaternion.Euler(0,0,0); //对象

解决Android中fragment_main.xml文件中的组件获取的问题

package com.dhy.phonedial; import android.app.Activity; import android.app.Fragment; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.Me

[js开源组件开发]query组件,获取url参数和form表单json格式

query组件,获取url参数和form表单json格式 距离上次的组件[js开源组件开发]ajax分页组件一转眼过去了近二十天,或许我一周一组件的承诺有了质疑声,但其实我一直在做,只是没人看到……,最近项目紧,几个小组,只有我一个前端,公司对前端的定位不清晰,导致前端人员过少的情况.所以还得促进公司前端人员增长,不然再这么玩下去,我要被玩死了,一个公司,不可能靠一个资深前端来支撑二三十个开发的需求,这是不现实的,特别是现在的页面不再是复制粘贴的前况下.我默默耕芸,所以这次我整理了这一个月里所有

VUE里子组件获取父组件动态变化的值

在VUE里父组件给子组件间使用props方式传递数据,但是希望父组件的一个状态值改变然后子组件也能监听到这个数据的改变来更新子组件的状态. 场景:子组件通过props获取父组件传过来的数据,子组件存在操作传过来的数据并且传递给父组件. 比如想实现一个switch开关按钮的公用组件: 1.父组件可以向按钮组件传递默认值. 2.子组件的操作可以改变父组件的数据. 3.父组件修改传递给子组件的值,子组件能动态监听到改变. 比如父组件点击重置,开关组件的状态恢复为关闭状态: 方法1: 1.因为存在子组件

使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图.下面就来看看本文实现的功能: Silverlight 与服务器利用Socket通讯,实时从服务器获取数据(本文中的数据是地理坐标),由于没有GPS,所以本文在服务器写了一个构造新坐标的函数(本文是一个三角函数),然后利用Timer组件,实时调用,得到新的坐标,并将新的坐标发送给客户端,客户端接收到发