还是扫描仪的问题

jianghuxiaozi 2003-09-22 08:11:30

我在程序中直接控制扫描仪,代码如下:

procedure TFormCar.SButDriverClick(Sender: TObject);
var
ImgScan:TImgScan;
BitMap:TBitmap;
DriverPhoto:String;
begin
DriverPhoto:='.\Image\Driver.bmp';
ImgScan:=TImgScan.Create(Nil);
BitMap:=TBitmap.Create;
ImgScan.ScanTo:=1;
ImgScan.FileType:=3;
ImgScan.PageOption:=6;
ImgScan.Image:=DriverPhoto;
ImgScan.OpenScanner
ImgScan.StartScan;
VDriverPhoto.Picture.LoadFromFile(DriverPhoto);
BitMap.LoadFromFile(DriverPhoto);
ZoomImage(BitMap,120,160,VDriverPhoto);
VDriverPhoto.CutToClipboard;
VDriverPhoto.PasteFromClipboard;
if FileExists(DriverPhoto) then
DeleteFile(DriverPhoto);
BitMap.Free;
ImgScan.Free;
end;


运行时却出现错误:Access Violation at address 77F62D4F in module GDI32.Dll,Read of address 00EEA6EB


请问这是怎么回事?
...全文
72 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianghuxiaozi 2003-11-14
  • 打赏
  • 举报
回复
Sorry,最近太忙啦
马上结贴
hlf 2003-11-12
  • 打赏
  • 举报
回复
TO:tellyes(小鱼)
能否也发一份你的源码给我。谢谢

syhhlf@163.com

另外想请教一下,我在98和2000下也是用KODAK的这套控件来扫描,但在XP下不行,看了一下,发现XP下没有KODAK的OCX,想问一下,你们在XP是怎么用KODAK的OCX的呢?
tellyes 2003-10-31
  • 打赏
  • 举报
回复
问题解决了吗,如果解决了,劳驾把帖子结了!
delphi_xizhousheng 2003-10-10
  • 打赏
  • 举报
回复
xizhousheng@sina.com
跟到VDriverPhoto.Picture.LoadFromFile(DriverPhoto);里面去就知道了
估计是没有调到指定的API,不用也不会报GDI32.DLL的错误
jpyc 2003-10-10
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2337/2337284.xml?temp=.1227686
angelior 2003-09-28
  • 打赏
  • 举报
回复
能給我一個嗎

zhou143-222@163.com
tellyes 2003-09-27
  • 打赏
  • 举报
回复
我是在XP下测试的
skywinner 2003-09-27
  • 打赏
  • 举报
回复
我在2K下,就是楼主的问题,解决方式就用的上面的
viaboy 2003-09-26
  • 打赏
  • 举报
回复
up
skywinner 2003-09-26
  • 打赏
  • 举报
回复
在98下面没有问题,但是在2k下会

这是由于winnt引入的API loadimage造成的!
因为用imagescan扫描后得到的bmp图形格式与常见的格式有些异样而loadimage竟然不认识!?

要解决这个问题需要显示的打开bmp文件,手工显示。下面是程序:

unit loadbitmap;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, AxCtrls, DBOleCtl;

procedure LoadBitmapFromFile(const filename:string;canvas:TCanvas);

implementation

procedure LoadBitmapFromFile(const filename:string;canvas:TCanvas);
var
t:TFileStream;
bh:BITMAPFILEHEADER;
bi:^BITMAPINFO;
bibu:pchar;
bih:BITMAPINFOHEADER;
buffer:PChar;
nchar:integer;
offsize:integer;
begin
t:=TFileStream.Create(filename,fmOpenRead);
try
T.Read(bh,sizeof(BITMAPFILEHEADER));
offsize:=bh.bfOffBits - sizeof(BITMAPFILEHEADER);
GetMem(bi,offsize);
t.Read(bi^,offsize);

bih:=bi^.bmiHeader;
nchar := (bih.biWidth * bih.biBitCount +31) div 32 * bih.biHeight * 4;

GetMem(buffer,nchar);
t.Read(buffer^,nchar);
StretchDIBits(canvas.Handle,0,0,bih.biWidth,bih.biHeight,0,0,bih.biWidth,bih.biHeight,buffer,bi^,DIB_RGB_COLORS,SRCCOPY);
freemem(buffer,nchar);
freemem(bi);
finally
t.Free;
end;
end;

end.

主要用到的东西就是BMP的文件格式。建议查有关资料
tellyes 2003-09-25
  • 打赏
  • 举报
回复
没道理,我侧过你的程序了,没有问题呀!
tellyes 2003-09-25
  • 打赏
  • 举报
回复
To jianghuxiaozi(江湖小子):下面是我找到的关于imgscan的一些说明和一个源程序,我没有测试,你自己按照下面的源码测试一下,如果还不行,那我再帮你想办法测一下。
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事件中写一段代码,把选择区域的边界值保存到四个全局变量中,在拷贝和剪切之前用先前保存的变量再进行一次选择即可(当然,这一切都在后台进行的,见前面的例子)。
lazio88 2003-09-24
  • 打赏
  • 举报
回复
还没收到tellyes(小鱼)的源码
我的E-MAIL:mengtx88@163.com
tellyes 2003-09-24
  • 打赏
  • 举报
回复
没收到源码吗?!!!!
jpyc 2003-09-24
  • 打赏
  • 举报
回复
tellyes(小鱼):给咱一份:jpyc008@163.com
jianghuxiaozi 2003-09-23
  • 打赏
  • 举报
回复
还在等待中......
jianghuxiaozi 2003-09-23
  • 打赏
  • 举报
回复
谢谢: tellyes(小鱼)
jianghuxiaozi_lby@sina.com.cn
拜托啦
tellyes 2003-09-23
  • 打赏
  • 举报
回复
老问题了,留下EMAIL,发一个源码给你。
jianghuxiaozi 2003-09-23
  • 打赏
  • 举报
回复
up
lazio88 2003-09-23
  • 打赏
  • 举报
回复
忘了留下E-mail:mengtx88@163.com
加载更多回复(7)

5,386

社区成员

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

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