用ImgScan进行证件扫描,扫描结束出现GDI32.DLL方面的错误!紧急!! ( 积分: 200 )

  • 主题发起人 主题发起人 ni_ck
  • 开始时间 开始时间
N

ni_ck

Unregistered / Unconfirmed
GUEST, unregistred user!
用ImgScan进行证件扫描,用的是专用的证件扫描仪,每次扫描结束的时候都出现"Access violation at address 77F643D1 in module 'GDI32.dll'.read of address 0113F7E8"的错误,都不知道哪里出了问题!
以下是程序的代码:
procedure TFmScan.suiButtonSelectClick(Sender: TObject);
begin
ImgScan1.ShowSelectScanner; //选择系统中已安装的扫描仪
end;

procedure TFmScan.suiButtonScanClick(Sender: TObject);
begin
ImgScan1.OpenScanner;
if not ImgScan1.ScannerAvailable then
begin
dbs.ShowMsgDlgInf('扫描仪没准备好!');
Exit;
end
else
try
begin
ImgScan1.Image:=ExtractFilePath(application.Name)+'99.bmp';
ImgScan1.zoom:=100;
ImgScan1.StartScan;
Application.ProcessMessages;
end;
finally
ImgScan1.CloseScanner;
Image1.AutoSize:=true;
Image1.Picture.LoadFromFile(ExtractFilePath(application.Name)+'99.bmp');
Image1.Top:=(suiImagePanel1.Height-Image1.Height) div 2;
Image1.Left:=(suiImagePanel1.Width-Image1.Width) div 2;
Image1.AutoSize:=false;
end;
end;

procedure TFmScan.suiButtonCancelClick(Sender: TObject);
begin
Close;
end;

procedure TFmScan.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DeleteFile(ExtractFilePath(application.Name)+'99.bmp');
DeleteFile(ExtractFilePath(application.Name)+'temp.bmp');
end;

procedure TFmScan.suiButtonLeftClick(Sender: TObject);
var
i,j:integer;
TmpBmp:TBitMap;
begin
TmpBmp:=TBitMap.Create;
rsrBmp:=TBitMap.Create;
rsrbmp:= Image1.Picture.Bitmap;
TmpBmp.Width:=rsrbmp.Height;
Tmpbmp.Height:=rsrBmp.Width;
try
for i:=0 to rsrbmp.Width-1 do
for j:=0 to rsrBmp.Height-1 do
TmpBmp.Canvas.Pixels[rsrBmp.Height-j-1,i]:=rsrbmp.Canvas.Pixels[i,j];
Image1.AutoSize:=true;;
Image1.Picture.Bitmap:=tmpbmp;
Image1.AutoSize:=false;
Image1.Top:=(suiImagePanel1.Height-Image1.Height) div 2;
Image1.Left:=(suiImagePanel1.Width-Image1.Width) div 2;
finally
TmpBmp.Free;
end;
end;

procedure TFmScan.suiButtonRightClick(Sender: TObject);
var
i,j:integer;
TmpBmp:TBitMap;
begin
TmpBmp:=TBitMap.Create;
rsrBmp:=TBitMap.Create;
rsrbmp:= Image1.Picture.Bitmap;
TmpBmp.Width:=rsrbmp.Height;
Tmpbmp.Height:=rsrBmp.Width;
try
for i:=0 to rsrbmp.Width-1 do
for j:=0 to rsrBmp.Height-1 do
TmpBmp.Canvas.Pixels[rsrBmp.Height-j-1,i]:=rsrbmp.Canvas.Pixels[i,j];
Image1.AutoSize:=true;;
Image1.Picture.Bitmap:=tmpbmp;
Image1.AutoSize:=false;
Image1.Top:=(suiImagePanel1.Height-Image1.Height) div 2;
Image1.Left:=(suiImagePanel1.Width-Image1.Width) div 2;
finally
TmpBmp.Free;
end;
end;
 
用ImgScan进行证件扫描,用的是专用的证件扫描仪,每次扫描结束的时候都出现"Access violation at address 77F643D1 in module 'GDI32.dll'.read of address 0113F7E8"的错误,都不知道哪里出了问题!
以下是程序的代码:
procedure TFmScan.suiButtonSelectClick(Sender: TObject);
begin
ImgScan1.ShowSelectScanner; //选择系统中已安装的扫描仪
end;

procedure TFmScan.suiButtonScanClick(Sender: TObject);
begin
ImgScan1.OpenScanner;
if not ImgScan1.ScannerAvailable then
begin
dbs.ShowMsgDlgInf('扫描仪没准备好!');
Exit;
end
else
try
begin
ImgScan1.Image:=ExtractFilePath(application.Name)+'99.bmp';
ImgScan1.zoom:=100;
ImgScan1.StartScan;
Application.ProcessMessages;
end;
finally
ImgScan1.CloseScanner;
Image1.AutoSize:=true;
Image1.Picture.LoadFromFile(ExtractFilePath(application.Name)+'99.bmp');
Image1.Top:=(suiImagePanel1.Height-Image1.Height) div 2;
Image1.Left:=(suiImagePanel1.Width-Image1.Width) div 2;
Image1.AutoSize:=false;
end;
end;

procedure TFmScan.suiButtonCancelClick(Sender: TObject);
begin
Close;
end;

procedure TFmScan.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DeleteFile(ExtractFilePath(application.Name)+'99.bmp');
DeleteFile(ExtractFilePath(application.Name)+'temp.bmp');
end;

procedure TFmScan.suiButtonLeftClick(Sender: TObject);
var
i,j:integer;
TmpBmp:TBitMap;
begin
TmpBmp:=TBitMap.Create;
rsrBmp:=TBitMap.Create;
rsrbmp:= Image1.Picture.Bitmap;
TmpBmp.Width:=rsrbmp.Height;
Tmpbmp.Height:=rsrBmp.Width;
try
for i:=0 to rsrbmp.Width-1 do
for j:=0 to rsrBmp.Height-1 do
TmpBmp.Canvas.Pixels[rsrBmp.Height-j-1,i]:=rsrbmp.Canvas.Pixels[i,j];
Image1.AutoSize:=true;;
Image1.Picture.Bitmap:=tmpbmp;
Image1.AutoSize:=false;
Image1.Top:=(suiImagePanel1.Height-Image1.Height) div 2;
Image1.Left:=(suiImagePanel1.Width-Image1.Width) div 2;
finally
TmpBmp.Free;
end;
end;

procedure TFmScan.suiButtonRightClick(Sender: TObject);
var
i,j:integer;
TmpBmp:TBitMap;
begin
TmpBmp:=TBitMap.Create;
rsrBmp:=TBitMap.Create;
rsrbmp:= Image1.Picture.Bitmap;
TmpBmp.Width:=rsrbmp.Height;
Tmpbmp.Height:=rsrBmp.Width;
try
for i:=0 to rsrbmp.Width-1 do
for j:=0 to rsrBmp.Height-1 do
TmpBmp.Canvas.Pixels[rsrBmp.Height-j-1,i]:=rsrbmp.Canvas.Pixels[i,j];
Image1.AutoSize:=true;;
Image1.Picture.Bitmap:=tmpbmp;
Image1.AutoSize:=false;
Image1.Top:=(suiImagePanel1.Height-Image1.Height) div 2;
Image1.Left:=(suiImagePanel1.Width-Image1.Width) div 2;
finally
TmpBmp.Free;
end;
end;
 
我没有扫描仪 也没用过 没有这方面的经验 有错误希望大家指正
扫描不是一个很快的过程 我认为ImgScan1.StartScan; 的结束应该是中断表示 而不是这样等待

ImgScan1.StartScan;一执行 图片还没有扫完 马上进行图片显示 一定是读取不了错误

ImgScan控件应该有个中断事件或者一个中断属性啥的吧。。。
比如ImgScan1.ScannerAvailable就可以看准备准备好
估计也会有个属性判断扫没扫描完 也许 ImgScan1.ScannerAvailable就能判断
ImgScan1.zoom:=100;
ImgScan1.StartScan;
while (not ImgScan1.ScannerAvailable) Begin end;
Application.ProcessMessages;
end;
finally
ImgScan1.CloseScanner;
Image1.AutoSize:=true;

应该有个中断事件是表示扫描结束是比较正常的 要不扫描过程中程序一直是僵硬状态 找一找ImgScan的事件吧
 
以前不用专用扫描仪,用普通扫描仪的时候可以正常运行!
 
不了解。。。我连扫描仪都没用过。。。[:D]
 
弄不好好是扫描仪的驱动问题,因为ImgScan是通过TWAIN调用扫描仪的驱动,所以有可能是驱动的问题,但是GDI报错,因为问题不在ImgScan,觉得是扫描介绍以后处理的时候出错,跟踪一下是不是在左右旋转的时候出错,如果是我给你介绍一种快速选择的方法
 
to chenybin;
左右选择出错是怎么样一种状况?实在是找不出问题的原因所在!
 
不好意思,打错字了,我的意思是左右旋转,也就是下面的两个函数,如果你没有点击这两个按钮出错吗?另外不用sui的控件,直接用button也出错吗?

procedure TFmScan.suiButtonLeftClick(Sender: TObject);
var
i,j:integer;
TmpBmp:TBitMap;
begin
TmpBmp:=TBitMap.Create;
rsrBmp:=TBitMap.Create;
rsrbmp:= Image1.Picture.Bitmap;
TmpBmp.Width:=rsrbmp.Height;
Tmpbmp.Height:=rsrBmp.Width;
try
for i:=0 to rsrbmp.Width-1 do
for j:=0 to rsrBmp.Height-1 do
TmpBmp.Canvas.Pixels[rsrBmp.Height-j-1,i]:=rsrbmp.Canvas.Pixels[i,j];
Image1.AutoSize:=true;;
Image1.Picture.Bitmap:=tmpbmp;
Image1.AutoSize:=false;
Image1.Top:=(suiImagePanel1.Height-Image1.Height) div 2;
Image1.Left:=(suiImagePanel1.Width-Image1.Width) div 2;
finally
TmpBmp.Free;
end;
end;

procedure TFmScan.suiButtonRightClick(Sender: TObject);
var
i,j:integer;
TmpBmp:TBitMap;
begin
TmpBmp:=TBitMap.Create;
rsrBmp:=TBitMap.Create;
rsrbmp:= Image1.Picture.Bitmap;
TmpBmp.Width:=rsrbmp.Height;
Tmpbmp.Height:=rsrBmp.Width;
try
for i:=0 to rsrbmp.Width-1 do
for j:=0 to rsrBmp.Height-1 do
TmpBmp.Canvas.Pixels[rsrBmp.Height-j-1,i]:=rsrbmp.Canvas.Pixels[i,j];
Image1.AutoSize:=true;;
Image1.Picture.Bitmap:=tmpbmp;
Image1.AutoSize:=false;
Image1.Top:=(suiImagePanel1.Height-Image1.Height) div 2;
Image1.Left:=(suiImagePanel1.Width-Image1.Width) div 2;
finally
TmpBmp.Free;
end;
end;
 
在扫描结束就出错的!现在不考虑左右旋转的问题
不用sui的控件也一样,主要是扫描的程序、图片大小、扫描仪自身的驱动会不会出问题?

使用了很多办法就是没法解决!
 
搞不懂了,可能是驱动的问题,重新装启动,或者换台机器看看行不行,只知道这么多了
 
后退
顶部