关于大位图pf1bt 格式 统计其中白的象素个数 不能使用pixels 属性,
  因为其严重的影响了效率。
使用了scanline 属性小的位图可能通过,但是调用了大图会报错
代码如下
rocedure ThreadImageArea.DoVisualSwap;
var
  Row: PByteArray;
  i, X, Y : Integer;
begin
  i:=0;
  for Y := 0 to FBitmap.Height -1 do //行数
  begin
    Row := FBitmap.ScanLine[y];
    for X:=0 to FBitmap.Width-1 do
    begin
      if Row[X]=clwhite then i:=i+1;
    end;
  end;
  with FImgParam do
  begin
    FileName:=intToStr(i);
  end;
end;

解决方案 »

  1.   

    完全错了,都说了是1bit,你这不把它当成1byte了吗?1byte=8bit,寻址不溢出才怪。而且还要看调色版,白色是0还是1都是不确定的。
      

  2.   

    看来 ehom 是行家,如果可以的请指导详细一点。我是有一段代码但结果,还是有有点问题
      

  3.   

    黑白图:
    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;
      

  4.   

    不正确的原因是与打描Bitmap.Canvas.Pixels 得出的结果值不一至。
      

  5.   

    Bitmap1.Width div 8 * 8 等于多少?比如Width为10,计算结果为8,每一行最后2个相素都没统计。除非Width是8的整数倍,否则肯定出错。pixblack + pixwhite = Width * Height,如果不等,很容易应该能分析问题在少统计了像素上。另外你都没读过调色板,就主观确定了黑白两色和0/1的关系,这是不正确的。最后要说的是,你这段代码效率有很大的提升空间。比如说你应该考虑把它改成单层循环。
      

  6.   

    谢谢ehom的支持。有没有办法,给一段代码,你希望我怎么感谢你。我只要能统计出白色的象素就可以了。其余的我可以将其计为黑色。
      

  7.   

    anxiong(暗汹) 
     最后是怎么改的,我也有同样的问题,传上来,分享一下好吗?