2013-02-16 7 views
3

Я хочу сохранить пиксели изображения в трехмерном массиве, и я сделал, как:трехмерный массив

public class ImageProcessing { 
    private BufferedImage image; 
    int p = image.getWidth(); 
    int q = image.getHeight(); 
    int r = 3; 
    private int[][][] data = new int[p][q][r]; 

тогда я получить значение пикселей с этого изображения и сохранить его в этот массив, и я делаю конструктор, как следующим образом:

public ImageProcessing(BufferedImage img){ 
     image = img; 
     for(int x = 0; x < image.getWidth(); x++){ 
      for(int y = 0; y < image.getHeight(); y++){ 
       int px = image.getRGB(x,y); 
       int alpha = (px >> 24) & 0xFF; 
       int red = (px >> 16) & 0xFF; 
       int green = (px >> 8) & 0xFF; 
       int blue = px & 0xFF; 
       data[x][y][0] = alpha; 
       data[x][y][1] = red; 
       data[x][y][2] = green; 
       data[x][y][3] = blue; 
      } 
     } 
    } 

тогда я хочу, чтобы получить его, чтобы преобразовать изображение в оттенках серого следующим образом:

public BufferedImage greyscale(){ 
     for(int x = 0; x < p ; x++){ 
      for(int y = 0; y < q ; y++){ 
       int avg = (data[x][y][1] + data[x][y][2] + data[x][y][3]/3); 
       int grey = (data[x][y][0]<<24) + (avg<<16) + (avg<<8) + avg; 
       image.setRGB(x, y, grey); 
      } 
     } 
     return image; 
    } 

Но когда я запускаю его, я показываю ошибку следующим образом. Я не знаю, что это значит и как его решить?

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at ImageProcessing.<init>(ImageProcessing.java:6) 
    at Main$1.run(Main.java:14) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

Как это решить? Есть идеи ?

+3

'int r = 3' должно быть' int r = 4', не так ли. Каждый цвет имеет 4 компонента. –

ответ

2

Очевидно, что это будет, потому что,

private BufferedImage image;  // had not initialized image 
    int p = image.getWidth();   // will be null 
    int q = image.getHeight();   // same here 
    int r = 3; 
    private int[][][] data = new int[p][q][r]; 

Вы не инициализируется BufferedImage image так, он в настоящее время указывают на нуль, и при инициализации p = image.getWidth(); и int q = image.getHeight();, то не имеет значения, так

private int[][][] data = new int[p][q][r];

Данное заявление будет вызывать NE.

Вы должны просто объявить массив в классе и инициализировать его в конструкторе вашего класса с инициализацией image.


Edit:

Заканчивать код ниже, его инициализации BufferedImage, а затем сделать то же самое, и его работает отлично !!

public class ArrayInitialize { 
    public static void main(String ar[]){ 
     File file = new File("Image.jpg"); 
     BufferedImage img = new BufferedImage(240, 240, BufferedImage.TYPE_INT_ARGB); 
     try { 
      img = ImageIO.read(file); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     int p = img.getWidth();   // will be null 
     int q = img.getHeight();   // same here 
     int r = 3; 
     int count = 0; 
     int[][][] data = new int[p][q][r]; 
     for(int i=0;i<p;i++){ 
      for(int j=0;j<q;j++){ 
       for(int k=0;k<r;k++){ 
        count++; 
       } 
      } 
     } 
     System.out.println(count); 
    } 
} 

Я думаю, после инициализации BufferedImage, если ваш получать NullPointerException то, что есть какая-то проблема с методом getImage(), может быть это не работает должным образом.

и увидеть свой комментарий

INT R = 3 должен быть INT R = 4 не так. Каждый цвет имеет 4 компонента.

+0

Я инициализировал изображение как: GettingImage get = new GettingImage(); \t private BufferedImage image = get.getImage(); после вашего ответа. Но ошибка по-прежнему, так как даже изображение инициализировано любым предложением для него? –

+0

Я обновил свой ответ. Проверьте это. И если это помогло вам, тогда вы можете отметить его как принятое. :) – Parth

+0

спасибо. Это 3 меняется, когда 4, работал правильно. Только две вещи: r = 4 и инициализация BufferedImage - мои ошибки, я принял ваш ответ. –

Смежные вопросы