Java ArrayIndexOutofBounds从像素数组计算平均值/平均值时发生异常

Java ArrayIndexOutofBounds从像素数组计算平均值/平均值时发生异常,java,android,arrays,bitmap,pixel,Java,Android,Arrays,Bitmap,Pixel,我正在尝试使用位图在Android中实现平均/平均3x3过滤器 每次我尝试应用此筛选器时,应用程序都会不断关闭。尝试对图像应用此筛选器时,我获取ArrayIndexOutOfBoundsException的错误 我的代码如下: for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { int index = 0; for (int

我正在尝试使用位图在Android中实现平均/平均3x3过滤器

每次我尝试应用此筛选器时,应用程序都会不断关闭。尝试对图像应用此筛选器时,我获取ArrayIndexOutOfBoundsException的错误

我的代码如下:

    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {

            int index = 0;

            for (int filterX = -filterWidth / 2; filterX < filterWidth / 2; filterX++) {
                for (int filterY = -filterHeight / 2; filterY < filterHeight / 2; filterY++) {

                    A = (pixels[x+filterX+width*(y+filterY)])>>24 & 0xFF;
                    R = (pixels[x+filterX+width*(y+filterY)] >> 16) & 0xFF;
                    G = (pixels[x+filterX+width*(y+filterY)] >> 8) & 0xFF;
                    B = pixels[x+filterX+width*(y+filterY)] & 0xFF;


                        }
                }
       }
 }
for(int x=0;x>24&0xFF;
R=(像素[x+过滤器x+宽度*(y+过滤器)]>>16)和0xFF;
G=(像素[x+过滤器x+宽度*(y+过滤器)]>>8)和0xFF;
B=像素[x+过滤器x+宽度*(y+过滤器)]&0xFF;
}
}
}
}

您不显示堆栈跟踪(编辑:现在显示,谢谢),这将指示哪一行抛出异常

然而,乍一看,您的问题在于:

for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
        int index = 0;
        for (int filterX = -filterWidth / 2; filterX < filterWidth / 2; filterX++) {
            for (int filterY = -filterHeight / 2; filterY < filterHeight / 2; filterY++) {
                A = (pixels[x+filterX+width*(y+filterY)])>>24 & 0xFF;
                R = (pixels[x+filterX+width*(y+filterY)] >> 16) & 0xFF;
                G = (pixels[x+filterX+width*(y+filterY)] >> 8) & 0xFF;
                B = pixels[x+filterX+width*(y+filterY)] & 0xFF;
                ...
            } 
        }
    }
 }

这将适用于所有奇数大小的筛选器。

您不显示堆栈跟踪(编辑:现在显示,谢谢),这将指示哪一行引发异常

然而,乍一看,您的问题在于:

for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
        int index = 0;
        for (int filterX = -filterWidth / 2; filterX < filterWidth / 2; filterX++) {
            for (int filterY = -filterHeight / 2; filterY < filterHeight / 2; filterY++) {
                A = (pixels[x+filterX+width*(y+filterY)])>>24 & 0xFF;
                R = (pixels[x+filterX+width*(y+filterY)] >> 16) & 0xFF;
                G = (pixels[x+filterX+width*(y+filterY)] >> 8) & 0xFF;
                B = pixels[x+filterX+width*(y+filterY)] & 0xFF;
                ...
            } 
        }
    }
 }

这将适用于所有奇数大小的筛选器。

请发布堆栈跟踪并指明导致异常的行。@JasonC如何获取堆栈跟踪数据?请发布堆栈跟踪并指明导致异常的行。@JasonC如何获取堆栈跟踪数据?谢谢。这似乎证实了我的怀疑。@User1204501你是说filterX/filterY循环?最后我记下了这件事。我会努力提高的。给我一分钟。这有很多问题要问。:)您应该能够自己进行边界检查逻辑(确定图像中读取位置的x和y坐标[easy,x+filterX和y+filterY],对照0和图像宽度/高度进行检查,并相应地进行剪辑)。我会先做一个简单的边界检查,然后只在性能不符合要求时考虑其他优化(例如创建填充边界)。我不会做任何边缘检测。因此,只需将前两个for循环替换为:for(int x=3;xsize/2而不是
3
(对于大小为3的过滤器,您实际上可以使用1而不是3)。谢谢。这似乎证实了我的怀疑。@User1204501你是说filterX/filterY循环?我在最后做了一个记录。我会努力改进。给我一分钟。这是一个很大的问题。:)你应该能够自己解决边界检查逻辑(确定图像中读取位置的x和y坐标)[简单,x+filterX和y+filterY],对照0和图像宽度/高度进行检查,并相应地进行剪辑)。我会先做一个简单的边界检查,然后考虑其他优化(例如,创建填充边框),只有在性能不符合要求的情况下才进行。我不做任何边缘检测atm。因此,只需将前两个for循环替换为:for(intx=3;xsize/2而不是
3
(对于大小为3的过滤器,您实际上可以使用1而不是3)。