请教BMP图片的面积计算(100分)

  • 主题发起人 主题发起人 江风山月
  • 开始时间 开始时间

江风山月

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个小程序,
读入只有黑白两色的Bmp格式的图片,
然后要求出黑色的面积。
好像要逐个象素扫描,还要转换成面积单位。
是不是有什么现成的函数什么的啊?
那位朋友写给我看一下好么?

我刚刚碰delphi几天,
所以想向各位高手请教!
不胜感激!
jiangfengshanyue@sina.com
 
是不是高手都不屑于回答这样的问题啊?
 
什么单位的啊 象素总数的?
 
说白了,
就是要求线路板扫描图(黑白两色的BMP)的铜面积(黑色部分)。
哪位朋友指点一下了?
谢谢!!
 
恐怕没有什么现成的函数,你自己写一个逐个的扫描吧!
 
需要转换了 看扫描后的图像和原图像比例 然后把图象的象素转换为mm 就可以求面积了
 
谢谢各位,
我已经有答案了。
是来自DarwinZhang朋友的!!

来自:DarwinZhang, 时间:2002-8-19 19:56:00, ID:1274309
注意象素格式,修改如下(格式是256色,16,24,32位BMP时):
procedure TForm1.SpeedButton3Click(Sender: TObject);
var
pixblack:cardinal;//黑色象素个数
pixwhite:cardinal;//白色象素个数
x,y:integer;//y是行数,x是列数
bitmap1:TBitmap;
pixcolo:PByteArray;
BytePP:Integer; //修改
begin
bitmap1:=TBitmap.create;
try
bitmap1.loadfromfile(filename1);
case bitmap.pixelformat of //修改
pf8bit: bytepp:=1; //不是pf8bit可能是pf8Bits,不对的话请查一下pixelformat的帮助
pf16bit: bytepp:=2;
pf24bit: bytepp:=3;
pf32bit: bytepp:=4;
else exit; //如果是其他格式,则有特殊情况
end;
pixblack:=0;
pixwhite:=0;
for y:=0 to bitmap1.height-1 do
begin //开始扫描
pixcolo:=bitmap1.ScanLine[y];
for x:=0 to (bitmap1.width div BytePP)-1 do //修改
if pixcolo[x*BytePP]=0 then pixblack:=pixblack+1 //修改
else pixwhite:=pixwhite+1;
end; //扫描结束
showmessage(inttostr(pixblack));
showmessage(inttostr(pixwhite));
finally bitmap2.free;
end;

end;

黑白图:
procedure TForm1.SpeedButton3Click(Sender: TObject);
var
pixblack:cardinal;//黑色象素个数
pixwhite:cardinal;//白色象素个数
x,y,z:integer;//y是行数,x是列数 ////修改
bitmap1:TBitmap;
pixcolo:PByteArray;
begin
bitmap1:=TBitmap.create;
try
bitmap1.loadfromfile(filename1);
pixblack:=0;
pixwhite:=0;
for y:=0 to bitmap1.height-1 do
begin //开始扫描
pixcolo:=bitmap1.ScanLine[y];
for x:=0 to (bitmap1.width div 8)-1 do //修改
for z:=0 to 7 do
if (pixcolo[x] shr z) and 1 =0 then pixblack:=pixblack+1 //修改
else pixwhite:=pixwhite+1;
end; //扫描结束
showmessage(inttostr(pixblack));
showmessage(inttostr(pixwhite));
finally bitmap2.free;
end;

end;
 
这个好象和文档例子差不多。
 
我是一个Delphi新手,我想问问bitmap1.ScanLine[y]是在屏幕上取点,
还是直接在文件中取点,我自己的猜想应该是在文件中点,
因为在以上的程序中对不同的位图的位数进行了整除,
希望众大虾能不吝赐教,谢谢了
 
Scanline 可以快速的对像素进行操作,可以读取和设置
图像每一行得像素颜色,它是一数组,它的每个元素代
表窗体表面或客户区的一个像素的颜色值。
 
象素和就是面积了
 
那也就是说是在屏显的内存中取点啰
 
实际上BMP格式还有16色的,但由于现在不大使用,所以没有给出。
另外,256色格式的BMP实际上是要到调色板中去读取颜色信息的,
但这里是灰度图,所以可以这样做。实际操作时只要稍微注意一下就好了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部