本帖最后由 guankai 于 2010-07-31 21:41:53 编辑

解决方案 »

  1.   

    在这一句上面设个断点,看看pixels内容
      

  2.   

    谢谢你的回答.
    pixels 是可以访问,pixels前面用的好的. 错误出现在系统函数@DnyArrayClear里面. 在cpu里看出来的.
     
    问题出现在这个子函数里面红色字.也就是函数结束部分 
       function calMean(x,y:integer):TRGBTriple;
        var pixels:TPixelArray;
            r:TRect;
            rpix:TRGBTriple;
            len,x1,y1,n,m:integer;
        begin
            r:=Rect(x,y,x+matrix_x-1,y+matrix_y-1);
            //平移
            x1:=Round(matrix_x/2)-1;
            y1:=Round(matrix_y/2)-1;
            OffsetRect(r,-x1,-y1);        //读矩形内的像素到数组 pixels
            ReadPixelArray(bit,r,pixels);        len:=high(pixels);
            m:=Round(len/2);
            //排序数组并取出中值
            SortPixelArray(pixels,0,len,tcRed);
            rpix.rgbtRed:=pixels[m].rgbtRed;
            SortPixelArray(pixels,0,len,tcGreen);
            rpix.rgbtGreen:=pixels[m].rgbtGreen;
            SortPixelArray(pixels,0,len,tcBlue);
            rpix.rgbtBlue:=pixels[m].rgbtBlue;
            setLength(pixels,0);
            pixels:=nil;
            result:= rpix;

        end;
      

  3.   

    PixPtr:PbyteArray改成PixPtr:TbyteArray,SetLength接收的数组定义,不是动态数组指针,你试试。
      

  4.   


    可是 PixPtr:=Pic.ScanLine[i]; 返回的是数组的指针再转成数组 应该不是这个问题吧.
    我把
    PixPtr:=Pic.ScanLine[i]; 
    改成
    PixPtr:= TbyteArray(Pic.ScanLine[i]^);
    转不了啊...出错: EAccessViolation 地址访问错误."SetLength接收的数组定义" 由于是不定大小的矩形区域所以无法固定接收数组的大小.
      

  5.   

    算了把数组改成Tlist 了. 想必是由于动态数组释放时候它里面的某些项目已经释放了.
      

  6.   

    TRGBTriple 结构是什么样子?
      

  7.   

    windows 单元 自带的.
      tagRGBTRIPLE = packed record
        rgbtBlue: Byte;
        rgbtGreen: Byte;
        rgbtRed: Byte;
      end;
      TRGBTriple = tagRGBTRIPLE;
      

  8.   

    楼主去看一下DELPHI数字图像处理这本书中的第五章,里面就有个中值滤波处理
      

  9.   

    前几天我也遇到过相同问题
    我的是图片像素读错了,导致存进数组的为空值
    所以虽然他提示是setLength(pixels,0)
    建议你检查下前面的像素读取有没错误
      

  10.   

    好久不搞delphi一搞就出问题。出问题与你是否经常搞delphi无关。
      

  11.   

        if (matrix_x<3) or (matrix_y<3) then exit;
        bitmap:=TBitMap.Create;
        bitmap.Assign(bit);
        for y := 0 to bitmap.Height - 1 do
        begin
            P := bitmap.ScanLine[y];
            for x := 0 to bitmap.Width - 1 do
            begin
                 pix:= calMean(x,y);
                 p[3 * x + 2] := pix.rgbtRed;
                 p[3 * x + 1] := pix.rgbtGreen;
                 p[3 * x ]    := pix.rgbtBlue;
            end;
        end;
        bit.Assign(bitmap);
        bitmap.Free;
    试试看,把bitmap 变量删掉。直接用 bit 是否会错?
      

  12.   

    像素数组读取是没错的.用这个方法读出来的像素数组实现其他的filter了.我改成TList就没这个问题了.所以才抓狂. 
      

  13.   

    这个有什么区别吗? 
    bit.Assign(bitmap); 
    能所一下原因吗?代码我已经改成TList了. 原来版本就没保存了.不好意思