0

我正在尝试逐像素读取图像,并希望将像素 RGB 值保存在数组中。但是当我尝试这样做时,我在语句
R[i]=redValue; 中遇到了一个异常;
有人请建议我可能做错了什么?

请在此处找到异常堆栈跟踪 -

paste.ubuntu.com/6216208

public class AnalyzeImage extends Activity  
{   
    int []R;  
    int []G;  
    int []B;  
    int width, height, i=0;  
    int a=1;  
    public int analyzeImagefunc(Bitmap bitmap)
    {            
    try{ 
     width  =  bitmap.getWidth();
     height = bitmap.getHeight();
     i = 0;
     for(int x = 0;x < width;x++)
     {
      for(int y = 0;y < height;y++)
      {
      int pixel = bitmap.getPixel(x,y);         
      int redValue = Color.red(pixel);
      int blueValue = Color.blue(pixel);
      int greenValue = Color.green(pixel);
      a=5;
      R[i]=redValue; 
      a=6;
      i++;
       }
      } 
     }

    catch(Exception e)
        {
            //nothing
        }
     return a;
 }  
} 
4

4 回答 4

3

您的数组在使用前需要先初始化。您已经声明了数组:

int []R;  
int []G;  
int []B;  

但未初始化它们。因此,如果您尝试访问任何数组元素,它将引发空指针异常。尝试初始化您的数组,如:

int []R = new int[10];  
int []G = new int[10];  
int []B = new int[10];  

您可以根据需要更改数组的大小。

于 2013-10-10T06:27:31.680 回答
2

整数 []R;
诠释[]G;
整数 []B;

R、G、B 在任何地方都没有初始化。

初始化 R

 width  =  bitmap.getWidth();
 height = bitmap.getHeight();
 i = 0;
 int size = height * width;
 R = new int[size]; // initialize the size of array R   
 for(int x = 0;x < width;x++)
于 2013-10-10T06:25:33.983 回答
2

数组需要以固定大小初始化。所以如果数组的大小不固定,那么你应该使用 ArrayList。如果最终输出需要,您还可以将 ArrayList 转换为数组。

    public class AnalyzeImage extends Activity {
        int[] R;
        int[] G;
        int[] B;
        ArrayList<Integer> R_Lst = new ArrayList<Integer>();
        ArrayList<Integer> G_Lst = new ArrayList<Integer>();
        ArrayList<Integer> B_Lst = new ArrayList<Integer>();

        int width, height, i = 0;
        int a = 1;

        public int analyzeImagefunc(Bitmap bitmap) {
            try {
                width = bitmap.getWidth();
                height = bitmap.getHeight();
                i = 0;
                for (int x = 0; x < width; x++) {
                    for (int y = 0; y < height; y++) {
                        int pixel = bitmap.getPixel(x, y);
                        int redValue = Color.red(pixel);
                        int blueValue = Color.blue(pixel);
                        int greenValue = Color.green(pixel);
                        a = 5;
//                      R[i] = redValue;
                        R_Lst.add(redValue);
                        B_Lst.add(blueValue);
                        G_Lst.add(greenValue);
                        a = 6;
                        i++;
                    }
                }
            }

            catch (Exception e) {
                // nothing
            }
            R=convertIntegers(R_Lst);
            return a;
        }
        public int[] convertIntegers(List<Integer> integers)
        {
            int[] ret = new int[integers.size()];
            for (int i=0; i < ret.length; i++)
            {
                ret[i] = integers.get(i).intValue();
            }
            return ret;
        }

//      (Note that this will throw a NullPointerException if either integers or any element within it is null.)
于 2013-10-10T06:29:28.563 回答
1
width = bitmap.getWidth();
height = bitmap.getHeight();
int n = width * height;
R = new int[n];  
G = new int[n];  
B = new int[n];
i = 0;

暗示,您还需要:

R[i] = redValue;
G[i] = greenValue;
B[i] = blueValue;
于 2013-10-10T06:35:49.543 回答