控制扫描仪?

citylord 2003-05-31 10:07:00
1.我想在程序中直接控制 扫描仪,这样不必要先把图片先扫下来,再存入数据库中了。
2.软件的开发环境是Dephi7+ MSSQLServer2000在Win2000Server环境下,软件的使用环境是win9x/winme/win2000pf
2.哪位前辈能给个例子?
...全文
372 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bcghb 2003-09-17
  • 打赏
  • 举报
回复
up
bcghb 2003-09-16
  • 打赏
  • 举报
回复
up
bcghb 2003-09-16
  • 打赏
  • 举报
回复
为什么
imgscan1.StartScan; //开始扫描图象
就死机,
请教imgscan1和imgedit1之间怎么设置属性?
IORILI 2003-08-26
  • 打赏
  • 举报
回复
一群牛人 哈哈
jpyc 2003-08-26
  • 打赏
  • 举报
回复
上面几位牛人基本搞定,大家说的也基本一样。

很好的图象控件,我早就给大家提示过,做这种东西最合适不过了,在这里,不知注意到没有:

http://expert.csdn.net/Expert/topic/2155/2155919.xml?temp=.3871881
lzniam 2003-08-26
  • 打赏
  • 举报
回复
好办法
2312 2003-08-26
  • 打赏
  • 举报
回复
的引用这个单元:
//////////////////////////////////////////////////////////////////////
unit MultiTWAIN;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, CommDlg;

// Some of the functions in EZTWAIN require unsigned integers. However,
// it was not until the recent release of Delphi 4 that Inprise implemented
// this; they did so with LongWord/Cardinal. As far as D2 and D3 go, this
// unit will attempt to substitute an Integer instead. I don't know if it'll
// work though!

type
{$IFDEF VER100}
UnsignedInt32 = Cardinal;
{$ELSE}
UnsignedInt32 = Integer;
{$ENDIF}
hDibCallbackProc = procedure(curdib: THandle; n: Integer); stdcall;

const
TWAIN_BW=1; { 1-bit per pixel, B&W (== TWPT_BW) }
TWAIN_GRAY=2; { 1,4, or 8-bit grayscale (== TWPT_GRAY) }
TWAIN_RGB=4; { 24-bit RGB color (== TWPT_RGB) }
TWAIN_PALETTE=8; { 1,4, or 8-bit palette (== TWPT_PALETTE) }
TWAIN_ANYTYPE=0; { any of the above }

TWAIN_PRESESSION=1; { source manager not loaded }
TWAIN_SM_LOADED=2; { source manager loaded }
TWAIN_SM_OPEN=3; { source manager open }
TWAIN_SOURCE_OPEN=4; { source open but not enabled }
TWAIN_SOURCE_ENABLED=5; { source enabled to acquire }
TWAIN_TRANSFER_READY=6; { image ready to transfer }
TWAIN_TRANSFERRING=7; { image in transit }

TWUN_INCHES=0;
TWUN_CENTIMETERS=1;
TWUN_PICAS=2;
TWUN_POINTS=3;
TWUN_TWIPS=4;
TWUN_PIXELS=5;

{$L eztwain.obj}
function TWAIN_SelectImageSource(hwnd: HWND): Integer; stdcall; external;
function TWAIN_AcquireNative(hwnd: HWND; pixmask: Integer): HBitmap; stdcall; external;
procedure TWAIN_FreeNative(hDIB: HBitmap); stdcall external;
function TWAIN_AcquireToClipboard(hwndApp: HWND; wPixTypes: UnsignedInt32): Integer; stdcall; external;
function TWAIN_AcquireToFilename(hWndApp: HWND; pszFile: PChar): Integer; stdcall; external;
function TWAIN_IsAvailable: Integer; stdcall; external;
function TWAIN_EasyVersion: Integer; stdcall; external;
function TWAIN_State: Integer; stdcall; external;


procedure TWAIN_RegisterCallback(fxn: hDibCallbackProc); stdcall; external;
procedure TWAIN_UnRegisterCallback; stdcall; external;

procedure TWAIN_ClearDibList; stdcall; external;
function TWAIN_GetNumDibs: Integer; stdcall; external;
function TWAIN_GetDib(n: Integer): THandle; stdcall; external;

function TWAIN_DibDepth(hDib: HBitmap): Integer; stdcall; external;
function TWAIN_DibWidth(hDib: HBitmap): Integer; stdcall; external;
function TWAIN_DibHeight(hDib: HBitmap): Integer; stdcall; external;
function TWAIN_DibNumColors(hDib: HBitmap): Integer; stdcall; external;
function TWAIN_CreateDibPalette(hdib: HBitmap): Integer; stdcall; external; // HANDLE & HPALETTE, respectively
procedure TWAIN_DrawDibToDC(
hDC: HDC;
dx, dy, w, h: Integer;
hDib: HBitmap;
sx, sy: Integer
); stdcall; external;
function TWAIN_WriteNativeToFilename(hdib: hBitmap; pszFile: PChar): Integer; stdcall; external;
function TWAIN_WriteNativeToFile(hdib: HBitmap; fh: Integer): Integer; stdcall; external;
function TWAIN_LoadNativeFromFilename(pszFile: PChar): HBitmap; stdcall; external;
function TWAIN_LoadNativeFromFile(fh: Integer): HBitmap; stdcall; external;
procedure TWAIN_RegisterApp( nMajorNum,nMinorNum: integer;
nLanguage: integer;
nCountry: integer;
lpszVersion: PChar;
lpszMfg: PChar;
lpszFamily: PChar;
lpszProduct: PChar); stdcall; external;
procedure TWAIN_SetHideUI(fHide: Integer); stdcall; external;
function TWAIN_GetHideUI: Integer; stdcall; external;
function TWAIN_GetResultCode: UnsignedInt32; stdcall; external;
function TWAIN_GetConditionCode: UnsignedInt32; stdcall; external;
function TWAIN_LoadSourceManager: Integer; stdcall; external;
function TWAIN_OpenSourceManager(hwnd: HWND): Integer; stdcall; external;
function TWAIN_OpenDefaultSource: Integer; stdcall; external;
function TWAIN_EnableSource(hwnd: hWnd): Integer; stdcall; external;
function TWAIN_DisableSource: Integer; stdcall; external;
function TWAIN_CloseSource: Integer; stdcall; external;
function TWAIN_CloseSourceManager(hWnd: HWND): Integer; stdcall; external;
function TWAIN_UnloadSourceManager: Integer; stdcall; external;
function TWAIN_MessageHook(lpmsg: PMSG): Integer; stdcall; external;
procedure TWAIN_ModalEventLoop; stdcall; external;
procedure TWAIN_NativeXferGetAll(psmg: PMSG); stdcall; external; // for multiple xfers
function TWAIN_AbortAllPendingXfers: Integer; stdcall; external;
function TWAIN_WriteDibToFile(lpDIB: PBITMAPINFOHEADER; fh: Integer): Integer; stdcall; external;
function TWAIN_NegotiateXferCount(nXfers: Integer): Integer; stdcall; external;
function TWAIN_NegotiatePixelTypes(wPixTypes: UnsignedInt32): Integer; stdcall; external;
function TWAIN_GetCurrentUnits: Integer; stdcall; external;
function TWAIN_SetCurrentUnits(nUnits: Integer): Integer; stdcall; external;
function TWAIN_GetBitDepth: Integer; stdcall; external;
function TWAIN_SetBitDepth(nBits: Integer): Integer; stdcall; external;
function TWAIN_GetPixelType: Integer; stdcall; external;
function TWAIN_SetCurrentPixelType(nPixType: Integer): Integer; stdcall; external;
function TWAIN_GetCurrentResolution: double; // implemented below
function TWAIN_SetCurrentResolution(dRes: double): Integer; // implemented below
function TWAIN_SetCapOneValue(Cap: UnsignedInt32; ItemType: UnsignedInt32; ItemVal: LongInt): Integer; stdcall; external;
function TWAIN_GetCapCurrent(Cap: UnsignedInt32; ItemType: UnsignedInt32; pVal: Pointer): Integer; stdcall; external;
function TWAIN_DS(DG: LongInt; DAT: UnsignedInt32; MSG: UnsignedInt32; pData: Pointer): Integer; stdcall; external;
function TWAIN_Mgr(DG: LongInt; DAT: UnsignedInt32; MSG: UnsignedInt32; pData: Pointer): Integer; stdcall; external;

procedure CopyDIBIntoImage(hDIB: THandle; Image: TImage);

implementation

{ The procedures implemented below are the ones which use floating point numbers }

const
ICAP_XRESOLUTION = $1118;
ICAP_PIXELTYPE = $0101;
TWTY_FIX32 = $0007;
TWTY_UINT16 = $0004;

type
TW_FIX32 = record
Whole: SmallInt;
Frac: Word;
end;

function ToFix32(r: Double): UnsignedInt32;
var
fix: TW_FIX32;
v: Integer;
begin
v := Round(r * 65536.0 + 0.5);
fix.Whole := ShortInt(V shr 16);
fix.Frac := Word (v and $ffff);
ToFix32 := UnsignedInt32(fix);
end;

function Fix32ToFloat(fix: TW_FIX32): double;
var
v: Integer;
begin
v := (Integer(fix.Whole) shl 16) or (UnsignedInt32(fix.frac) and $ffff);
Fix32ToFloat := v / 65536.0;
end;

function TWAIN_GetCurrentResolution: double;
var
res: TW_FIX32;
begin
TWAIN_GetCapCurrent(ICAP_XRESOLUTION, TWTY_FIX32, @res);
TWAIN_GetCurrentResolution := Fix32ToFloat(res);
end;

function TWAIN_SetCurrentResolution(dRes: double): Integer;
begin
TWAIN_SetCurrentResolution := TWAIN_SetCapOneValue(ICAP_XRESOLUTION, TWTY_FIX32, ToFix32(dRes));
end;

(*************************************************)

procedure CopyDIBIntoImage(hDIB: THandle; Image: TImage);
var
DibW, DibH, oldw, oldh: integer;
begin
Oldw := Image.Width;
Oldh := Image.Height;
DibW := TWAIN_DibWidth(hDib);
DibH := TWAIN_DibHeight(hDib);
Image.Width := DibW; // temporarily enlarge image to ensure the whole
Image.Height := DibH; // DIB gets copied
TWAIN_DrawDibToDC(Image.Canvas.Handle, 0, 0, DibW, DibH, hDIB, 0, 0);
Image.Width := oldw;
Image.Height := oldh;
end;


end.


2312 2003-08-26
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtDlgs;

type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
Button3: TButton;
SaveDialog1: TSaveDialog;
Image1: TImage;
OpenPictureDialog1: TOpenPictureDialog;
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
hdib, testdib: hbitmap;
w, h: integer;
n: Integer;
end;

var
Form1: TForm1;
procedure CallbackFxn(CurDib: THandle; index: Integer); stdcall; forward;
implementation

uses MultiTWAIN;

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
hDib := 0;
w := 0; h := 0;
testDib := 0;
TWAIN_RegisterCallback(CallbackFxn);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if image1.Picture<>nil
then
image1.Picture:=nil;
TWAIN_SelectImageSource(0);
hdib := TWAIN_AcquireNative(0, 0);

n := TWAIN_GetNumDibs;
TestDib := TWAIN_GetDib(0);
CopyDibIntoImage(TestDib, Image1);
TWAIN_FreeNative(TestDib);
TestDib := 0;
end;

procedure CallbackFxn(CurDib: THandle; index: Integer); stdcall;
begin
MessageBox(0, '扫描完成!', '提示', mb_ok);
end;


windwather 2003-07-16
  • 打赏
  • 举报
回复
在Delphi中控制扫描仪
---- 在利用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事件中写一段代码,把选择区域的边界值保存到四个全局变量中,在拷贝和剪切之前用先前保存的变量再进行一次选择即可(当然,这一切都在后台进行的,见前面的例子)。

dawnming 2003-07-16
  • 打赏
  • 举报
回复
帮你up一下
cow8063 2003-07-16
  • 打赏
  • 举报
回复
在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:图象的文件类型(该构件支持三种:TIF

F,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事件中

写一段代码,把选择区域的边界值保存到四个全局变量中,在拷贝和剪切之前用

先前保存的变量再进行一次选择即可(当然,这一切都在后台进行的,见前面的

例子)。

 


soaringsouth 2003-07-16
  • 打赏
  • 举报
回复
http://cnprogram.myrice.com/article/delphi/delphi127.html的文章或许堆泥有所帮助
whitetiger8 2003-05-31
  • 打赏
  • 举报
回复
activeX控件中的Kodak的确非常好!
blueshu 2003-05-31
  • 打赏
  • 举报
回复
学习
hansion3406 2003-05-31
  • 打赏
  • 举报
回复
嗯...真强...呵呵..
bbs791109 2003-05-31
  • 打赏
  • 举报
回复
1﹑先將ACTIVEX控件加進去。(Kodak image系列)
2﹑imgscan1.ShowSelectScanner;
if not imgscan1.ScannerAvailable then
imgscan1.OpenScanner;
imgscan1.StartScan;
imgscan1.CloseScanner;
if imgedit1.ImageDisplayed=true then
begin
imgedit1.SaveAs('photo.bmp');
end;

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧