procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if form1.openpicturedialog1.Execute then
loadbmpfile(openpicturedialog1.filename);
image1.picture.loadfromfile(openpicturedialog1.filename);---——*
end;
注:loadbmpfile(openpicturedialog1.filename);是我自定义的一个函数,主要作用是把一副图(bmp)的文件头、信息头,很像素值读到内存,可是程序运行到‘*’这个地方就不能往下运行了,各为高手,这是为什么呢(就是会执行到这个过程的最后一行)
begin
if form1.openpicturedialog1.Execute then
loadbmpfile(openpicturedialog1.filename);
image1.picture.loadfromfile(openpicturedialog1.filename);---——*
end;
注:loadbmpfile(openpicturedialog1.filename);是我自定义的一个函数,主要作用是把一副图(bmp)的文件头、信息头,很像素值读到内存,可是程序运行到‘*’这个地方就不能往下运行了,各为高手,这是为什么呢(就是会执行到这个过程的最后一行)
解决方案 »
- 进销存问题:如何对“客户付款期限”和“已过应收账时间”(比如过了期限15天、30天、60天、90天)进行预警?
- 求Indy最新版本
- 谁有GIF编码解码详细资料!高分相送!
- 钩子keyHOOK怎么样才能渗透到其它进程里?
- 诚征公司名称和公司网站域名,谢谢大家
- 寻<<PC游戏编程--人机博弈>>的电子版或下载网址,马上结帐!最好有源码!
- 请问哪里有“Delphi 5.X ADO_MTS_COM+高级程序设计篇”书下载?
- access中提取一个字段的子串是哪个函数?
- 新手求组!关于delphi 调取oracle过程,帮忙看下问题在哪?
- 请问在Webbrowser中如果复制页面的内容?
- 用indy9.0 怎样制作局域网下的远程屏幕监控?
- quickrpt 报表的问题
begin
loadbmpfile(openpicturedialog1.filename);
image1.picture.loadfromfile(openpicturedialog1.filename);
end;//通常是这样使用dialog函数的
我把这个函数拷在下面,帮我看看好吗?
function LoadBmpFile(BmpFile: String): Boolean;
begin
AssignFile(hf,BmpFile);
Reset(hf,1);
BlockRead(hf,bf,SizeOf(BITMAPFILEHEADER));
BlockRead(hf,bi,SizeOf(BitMapInfoHeader)); //计算一行象素中最少的Byte数
widthBytes := trunc(((8-(bi.biWidth*bi.biBitCount mod 8)) mod 8 + bi.biWidth*bi.biBitCount)/8); // 一行象素的Byte数应为4的整数倍
LineBytes := (4-(widthbytes mod 4)) mod 4 + widthbytes;//修正字节数 NullCount := LineBytes - WidthBytes; //每行字节数必须为4的倍数,不足补0
ImgSize:= LineBytes*bi.biHeight;
x:=LineBytes;
y:=bi.biHeight;
if bi.biClrUsed <>0 then
NumColors := bi.biClrUsed
else
begin
case bi.biBitCount of
1:NumColors := 2;
4:NumColors := 16;
8:NumColors := 256;
24:NumColors := 0;
else
begin
ShowMessage('Invalid color numbers!');
CloseFile(hf);
Result := False;
Exit;
end;
end;
end;
if bf.bfOffBits <> NumColors*SizeOf(RGBQUAD)+SizeOf(BitmapFileHeader)+SizeOf(BitmapInfoHeader)
then
begin
ShowMessage('Invalid color numbers!');
CloseFile(hf);
Result := False;
Exit;
end;
Setlength(hImgData,ImgSize);
BlockRead(hf,hImgData[0],ImgSize,bytereaded);
CloseFile(hf);
Result := True;
end;
谢谢您。
你可以在
BlockRead(hf,bf,SizeOf(BITMAPFILEHEADER),vsize1);
BlockRead(hf,bi,SizeOf(BitMapInfoHeader),vsize2);
中断调试一下,看返回的长度是否正常。
要不将
BlockRead(hf,hImgData[0],ImgSize,bytereaded);
该为
BlockRead(hf,hImgData,ImgSize,bytereaded);
试一试。
if form1.openpicturedialog1.Execute then
loadbmpfile(openpicturedialog1.filename);
image1.picture.loadfromfile(openpicturedialog1.filename);---——*那就应该是你的loadbmpfile 函数可能有错
你可以把那段代码贴出来啊~~~
那样才好给你………………
BlockRead(hf,bi,SizeOf(BitMapInfoHeader),vsize2);
而且要是把BlockRead(hf,bf,SizeOf(BITMAPFILEHEADER),vsize1);
BlockRead(hf,bi,SizeOf(BitMapInfoHeader),vsize2);改为BlockRead(hf,hImgData,ImgSize,bytereaded);会出现一个异常类的错误,错误为“EInOutError with message I/O error 998'.
小鱼儿:您好,谢谢您!我的loadbmpfile 函数已经贴在前面了。
这里:
BlockRead(hf,bf,SizeOf(BITMAPFILEHEADER));
BlockRead(hf,bi,SizeOf(BitMapInfoHeader));
是不是都是从文件头开始读呢?或者把读出来的文件先保存起来看看内容,我觉得第二次读出的数据应该接着第一次的结尾。
若用流会方便很多的。