所以我对Java很新,我正在尝试编写一个for循环来遍历图像中的所有像素,但由于某些未知原因,for循环从不递增。当我尝试运行代码时,它打印出图像的高度和宽度,分别分配给变量“height”和“width”,然后输入for循环,但只输出0和0之前完成运行。
public class ImageProcessor {
public static Pic image;
public static Pic modImage;
public static int width;
public static int height;
public static int average;
public static Pixel modPixel;
public static void main(String[] args) {
Pic image = new Pic(args[0]);
int width = image.getWidth();
int height = image.getHeight();
System.out.println(width);
System.out.println(height);
greyscale();
}
public static Pic greyscale() {
for (int w = 0; w <= width; w++) {
for (int h = 0 ; h <= height; h++) {
System.out.println(w);
System.out.println(h);
}
}
return image;
}
}
答案 0 :(得分:6)
您的主要方法将width
和height
声明为local
变量,遮蔽具有相同名称的静态变量,并将它们设置为默认值0
。将main方法中的代码更改为:
width = image.getWidth();
height = image.getHeight();
答案 1 :(得分:1)
问题是你没有将getWidth和getHeight结果分配给顶部的静态变量。
因为你写过:
int width = ...
它实际上创建了一个名为“width”的 new 局部变量。当调用greyscale方法时,它不知道这个变量。
如果您将这些行更改为:
width = ...
它会将它分配给静态变量。
作为一般原则,甚至更好的目的是避免使用全局(即静态)变量传递状态。而是在调用时为灰度方法提供所需的一切。
public static Pic greyscale(int width, int height)
这意味着当你使用方法时,你永远不必依赖世界的外部状态是正确的,使你的程序的推理变得更容易,并且你不太可能通过改变宽度/高度来引入错误。其他代码。
答案 2 :(得分:0)
您的main方法定义了同名的局部变量;它们会影响您的静态width
和height
字段;
public static int width; // <-- default to 0.
public static int height; // <-- default to 0.
public static void main(String[] args) {
Pic image = new Pic(args[0]);
width = image.getWidth(); // <-- use the static width
height = image.getHeight(); // <-- use the static height
System.out.println(width);
System.out.println(height);
greyscale();
}
答案 3 :(得分:0)
在主方法中删除int
和width
之前的height
。