gpt4 book ai didi

java - 三维数组

转载 作者:行者123 更新时间:2023-11-30 09:26:34 28 4
gpt4 key购买 nike

我想将图像像素存储在三维数组中,我这样做了:

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)

如何解决?有什么想法吗?

最佳答案

显然,这是因为,

    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

您应该只在类中声明数组,并且应该在类的构造函数中使用初始化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);
}
}

我认为,在初始化 BufferedImage 之后,如果你得到一个 NullPointerException 那么,你的 getImage() 方法有问题,可能是它无法正常工作。

并查看评论

int r=3 should be int r=4 isn't it. Each color has 4 components.

关于java - 三维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14908010/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com