2

画像のピクセルを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)

それを解決する方法は?何か案が ?

4

1 に答える 1

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ので、現在はnullを指しています。そして、初期化するp = image.getWidth();int q = image.getHeight();、値がないので、

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

上記のステートメントはをスローしNEます。

Classで配列を宣言し、クラスのコンストラクターでinitializingを使用して配列を初期化する必要がありますimage


編集:

以下のコードをチェックしてください。初期化し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);
    }
}

BufferedImageifを初期化した後NullPointerException、メソッドに問題があると思いgetImage()ます。正しく機能していない可能性があります。

そしてコメントを見る

int r=3はintr=4である必要がありますね。各色には4つの要素があります。

于 2013-02-16T07:38:08.920 に答える