(有原代码!)(救命啊!!)我写了一个小程序用来统计一个黑白位图中的黑白像素的个数,可是后来用一个图片检验了一下发现有问题,谁能帮帮我啊!!! (100分)

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

江风山月

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个小程序用来统计一个黑白位图中的黑白像素的个数,
可是后来用一个图片检验了一下发现有问题:
用来检验的图片是32*32像素大小(32*32=1024),
然后半边涂成黑的半边是白的(按理说是白512个,黑512个)。
可是我的不同情况结果不一样啊:

左半边黑,右半边白,结果:黑568,白456
左半边白,右半边黑,结果:黑568,白456
上半边黑,下半边白,结果:黑624,白400
上半边白,下半边黑,结果:黑512,白512

只有最后一个结果是对的啊!
哪位朋友愿意伸出援助之手啊!!
百分感激!!!!!
(可惜我分不多了,要不然一定多给点,所以只好先送上100分了,不要嫌少啊)


procedure TForm1.SpeedButton3Click(Sender: TObject);
var
pixblack:cardinal;//黑色象素个数
pixwhite:cardinal;//白色象素个数
x,y:integer;//y是行数,x是列数
bitmap1:TBitmap;
pixcolo:PByteArray;

begin
bitmap2:=TBitmap.create;
try
bitmap2.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-1 do
if pixcolo[x]=0 then pixblack:=pixblack+1
else pixwhite:=pixwhite+1;
end; //扫描结束
showmessage(inttostr(pixblack));
showmessage(inttostr(pixwhite));
finally bitmap2.free;
end;

end;

 
好像没什么问题啊。。。

我怀疑是不是图片有问题? 比如说白色的部分实际上是很浅的灰色,就不是0了。。。
 
程序里一会儿 Bitmap1 一会 Bitmap2 ,把它们改成一样的。
程序应该没问题,我试过了。
 
请各位仔细分析一下你们的图象文件的格式。
举个例子,如果是BMP格式(我想楼主的情况应该是这种),千万别忘记图象数据中是
“一点素= 3 Bytes”!也就是“三原色”存储方式,所以:
图片一行Byte数组实际长度= 3 x bitmap1.width

也就是说,在这种情况下,应该将程序中的:
for x:=0 to bitmap1.width-1 do
改为:
for x:=0 to 3*bitmap1.width-1 do

困啊~~~睡觉去.zzZ

 
谢谢各位,
可是我按照 kyo_2000 的方法改了后,
还是不行。
我要处理的图片格式是BMP,但是是1位色的,只有黑白!
我不是很清楚他的机理。
PByteArray和Scanline也不是很明白。
我发现把PByteArray改成PWordArray后结果又不一样,(瞎改的试试看的)
我是菜鸟一个啊,还望高手指点!!
 
把你的图片、程序都打包发过来看看,我也很想搞清楚这件事。
 
注意象素格式,修改如下(格式是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;

 
谢谢大家!
尤其要感谢DarwinZhang,你的解答很仔细!
如果可以的话,介绍几篇关于这方面的文章给我好么?
我的email是 jiangfengshanyue@sina.com
再次感谢!
 
分值不算多,
大家心领我的谢意吧!
 
惭愧,我看完书后总是把书的名字忘掉。
但你可以看一些图形处理方面的书,书店里很多的。
 

Similar threads

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