支持扫描仪扫描(100分)

  • 主题发起人 主题发起人 pert
  • 开始时间 开始时间
P

pert

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位大虾:
如何编写支持扫描仪扫描的程序?
 
在DELPHI中装个
科达图象扫描的ACTIVEX就行了,
这个是DELPHI自带的,
也可以自己写控件来控制扫描仪
 
在Delphi中控制扫描仪
作者: 评价: 上站日期: 2001年09月05日
内容说明:
来源:

---- 在利用Delphi开发信息管理系统时,常常要处理图象,这也是信息管理系统发展的必然趋势。怎样在Delphi中通过扫描仪获得所需的图象信息呢?不外乎有三种基本的方法:

通过图象处理软件,比如说Photoshop等,通过它们的扫描图象的功能,加工成一定格式的图象后再在自己的系统中利用;

通过扫描仪接口Twain.DLL 。该接口是在安装扫描仪时提供的,它实际上是一个Plugin插件,它通过一系列函数来控制扫描仪;

通过构件技术来控制扫描仪。
---- 利用第一种方法能减少编程的复杂度,但是系统的集成度不高,用户使用上也不方便;第二种方法能在驱动程序级直接控制扫描仪,能在编程上提供最大的灵活性和可控性;第三种方法能充分利用Delphi的可视化构件技术,安全、灵活、自由地利用扫描仪。其实第三种方法也是建立在扫描仪接口Twain.DLL之上的。本文论述的方法就采用第三种。
---- Windows9X在其附件中提供了“映象”可选件,该附件是采用OCX构件来控制扫描仪的,共有imgEdit、imgAnntool、imgScan、imgAdmin 四个,有这四个构件基本上就能完全控制扫描仪。在Delphi中的用法如下:

在Windows9x中选择安装“映象”。(在控制面板中选择“添加/删除程序”,再选择“安装Windows”,点击“附件”复选框,然后从“详细资料”按钮中可以找到“映象”)

启动Delphi,选择“Component”菜单项下的“Import ActiveX Control”,这时可以看到列表中有“Wang 图象编辑控制、Wang 图象扫描控制、Wang 图象管理控制、Wang 图象缩略图控制”,选中这四项,然后点击“Install”按钮,这时在构件面板上的ActiveX舌标下就可以看到这四个构件的图标。
---- ImgScan 的主要属性:FileType:图象的文件类型(该构件支持三种:TIFF,BMP,AWD);
ScanTo:返回或设置被扫描图象的目的;
可取值 含义
0 (缺省) 显示被扫描的图象.
1 显示被扫描的图象并写入一个文件.
2 把图象写入一个文件
3 以模板方式把图象写入文件并显示.
4 . 以模板方式把图象写入文件
5 传真被扫描的图象
注意:如果取缺省值0,
必须和 Wang ImgEdit 构件配合使用。
DestImageControl:Wang ImgEdit构件名;
Zoom:图象的放缩比例

ImgScan 的主要方法:OpenScanner :打开扫描仪;
CloseScanner :关闭扫描仪;
StartScan : 开始扫描;
StopScan : 停止扫描


---- ImgEdit 的属性主要是控制扫描图象的分辨率、图象的宽高、是否允许对图象进行局部选 择等;其方法主要有拷贝、剪切图象到粘贴板,从粘贴板复制图象,旋转、放缩、 镜象图象;打印、保存、刷新图象等。
---- 关于上述四个OCX构件的详细使用说明可在Delphi中查看其自带的帮助系统。

---- 下面是使用这两个构件的一些例子:

procedure Tscanf.N1Click(Sender: TObject);
begin
ImgScan1.ShowSelectScanner;
//选择系统中已安装的扫描仪
end;

procedure Tscanf.N2Click(Sender: TObject);
begin
imgedit1.zoom:=100; //设置图象的放缩因子
if not imgscan1.ScannerAvailable then
//如果选择的扫描仪不可用
imgscan1.OpenScanner;//打开扫描仪
imgscan1.StartScan; //开始扫描图象
imgscan1.CloseScanner; //关闭扫描仪
end;


procedure Tscanf.N8Click(Sender: TObject);
begin
if (imgedit1.IsClipboardDataAvailable
and imgedit1.ImageDisplayed ) then
imgedit1.ClipboardPaste(selleft,seltop);
//从剪贴板粘贴图象,其参数为Imgedit的显示区域的起始坐标
end;

procedure Tscanf.N1801Click(Sender: TObject);
begin
if imgedit1.ImageDisplayed then
imgedit1.Flip; //镜象图象
end;

procedure Tscanf.N901Click(Sender: TObject);
begin
if imgedit1.ImageDisplayed then
imgedit1.RotateRight //向右旋转图象
end;
procedure Tscanf.N6Click(Sender: TObject);
begin
imgedit1.DrawSelectionRect(selleft,
seltop,selwidth,selheight);//进行图象局部选择
imgedit1.ClipboardCut(selleft,seltop,
selwidth,selheight);//剪切所选区域
end;


---- 注意:在DELPHI中使用Imgedit构件的拷贝和剪切功能时,会出现以下问题:
---- 1、 如果把整幅图象都选中,没有任何问题;

---- 2、 如果选择了局部区域,则拷贝和剪切的区域会发生漂移;

---- 3、 如果DELPHI做的是MS SQL后端数据库的客户端界面,那么在把图象内容写入数据库的图象字段中时,BDE(数据库引擎)会报错。这是DELPHI3。0和4。0的BUG,4。0的升级包可以解决这个问题。

---- 至于第二个问题,可这样解决:在Imgedit的onSelectionRectDrawn事件中写一段代码,把选择区域的边界值保存到四个全局变量中,在拷贝和剪切之前用先前保存的变量再进行一次选择即可(当然,这一切都在后台进行的,见前面的例子)。




 
这种办法可行!但是如何在程序中确定扫描仪是否安装呢?不是驱动!
 
twain编程.在网上查一下:delphi twain, 你会找到很多你要的资料
 
可怜啊


ie1.9.7b

Copyright ?1998-2001 by Hyrix Technologies Srl. All rights reserved.

hycomp@hyrix.com

http://www.hyrix.com/dev


This software comes without any warranty either implied or expressed. In no case shall the author be liable for any damage or unwanted behavior of any computer hardware and/or software.

Hyrix Technologies Srl grants you the right to include the compiled component in your application, whether COMMERCIAL, SHAREWARE, or FREEWARE, BUT YOU MAY NOT DISTRIBUTE THE SOURCE CODE OR ITS COMPILED .DCU IN ANY FORM.



(c) 1999-2001 by Hyrix Technologies
Hyrix Technologies Srl
hycomp@hyrix.com
 
为什么我在winxp中找不到原来在win2000和win98里可调用的扫描仪接口?
 
这是我做的一段程序,已经实现了。

procedure TfrmScan.btnBeginScanClick(Sender: TObject);
var
tmpJPEG:TJPEGImage;
tmpIniFile: TIniFile;
begin
{弹出保存文件窗体}
If not Assigned(frmSaveDlg) Then
frmSaveDlg:=TFrmSaveDlg.Create(Application);
If frmSaveDlg.ShowModal=mrCancel Then Exit;

{开始扫描各步骤}
Application.ProcessMessages;
ImgScan1.ScanTo:=1;
ImgScan1.DestImageControl:='ImgEdit1';
Try
If Not ImgScan1.ScannerAvailable then
ImgScan1.OpenScanner;
Except
MessageBox(Handle,'扫描仪没准备好','警告',MB_OK+MB_ICONWARNING);
Exit;
End;
Try
//开始扫描
ImgScan1.StartScan;
ImgScan1.CloseScanner;

If FileExists(ImgScan1.Image) Then Begin
//显示图像
Image1.Picture.LoadFromFile(ImgScan1.Image);
//删除过渡文件
DeleteFile(ImgScan1.Image);
//转换成JPG格式
tmpJPEG:=TJPEGImage.Create;
tmpJPEG.Assign(Image1.Picture.Bitmap);
{设置压缩率}
tmpIniFile:= TIniFile.Create(ExtractFilePath(Application.ExeName)+'../Setup.ini');
tmpJPEG.CompressionQuality:=tmpIniFile.ReadInteger('扫描图片','压缩率',65);
tmpIniFile.Free;
//保存成JPG文件
tmpJPEG.SaveToFile(Copy(ImgScan1.Image,1,Length(ImgScan1.Image)-4)+'.jpg');
End;
Finally
End;
End;

//选择扫描仪
procedure TfrmScan.btnSelBtnClick(Sender: TObject);
begin
Application.ProcessMessages;
ImgScan1.ShowSelectScanner;
end;

//显示选中图片
procedure TfrmScan.ShellListView1Change(Sender: TObject; Item: TListItem;
Change: TItemChange);
begin
If Not Assigned(ShellListView1.Selected) Then Exit;
Try
Image1.Picture.LoadFromFile(ShellListView1.Folders[ShellListView1.Selected.index].PathName);
Except

End;
end;

//放大图像
procedure TfrmScan.Image1Click(Sender: TObject);
begin
If Not Assigned(Image1.Picture.Graphic) Then Begin
MessageBox(Handle,'无图像显示,请选择受理编号!','注意',MB_OK+MB_ICONWARNING);
Exit;
End;
If Not Assigned(frmZoomOut) Then
frmZoomOut:=TFrmZoomOut.Create(Self);
frmZoomOut.Image1.Picture.Bitmap.Assign(Self.Image1.Picture.Graphic);
frmZoomOut.ShowModal;
end;
 
还有,象sundart所说的BDE会出错,如果用ADO就不存在这个问题。
 
能否做到扫描时不弹出描扫窗口,在程序中直接扫描、动态指定扫描区域、扫描分辩率等信息……
?????

如果能做到的话我也赞助一点分
 
看不到讨论的内容!
why?
急急急
cyy163@163.com
 
[:D]
哎呀~~都给你们说了
你们看看那个ie1.9.7b是干啥的,好好看看

这个是2001的delphi控件奖得主公司的

也是我所见过最好的twain控件:

我想跳楼!!!因为以前我用vc就在...
 
我非常需要,请帮忙!
 
后退
顶部