我收到了这个错误。
线程中的异常" main" java.lang.Error:未解决的编译问题: rgb2无法解析为变量
它始终是导致错误的rgb2数组。如何解决这个问题?
BufferedImage img1 = ImageIO.read(file1);
BufferedImage img2 = ImageIO.read(file2);
int w = img1.getWidth();
int h = img1.getHeight();
long diff = 0;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
int rgb1[] = img1.getRGB(x, y, w, h, rgb1, 0, w);
int rgb2[]= img2.getRGB(x, y, w, h, rgb2, 0, w);
int index = y * w + x;
int r1 = (rgb1[index] >> 16) & 0xff;
int g1 = (rgb1[index] >> 8) & 0xff;
int b1 = (rgb1[index] ) & 0xff;
int r2 = (rgb2[index] >> 16) & 0xff;
int g2 = (rgb2[index]>> 8) & 0xff;
int b2 = (rgb2[index] ) & 0xff;
r2 += Math.abs(r2 - r1);
g2 += Math.abs(g2 - g1);
b2 += Math.abs(b2 - b1);
rgb2[index] = (((r2 & 0xff) << 16) + ((g2 & 0xff) << 8) +(b2 & 0xff));
rgb2[index] = (rgb2[index]*17);
}
}
int i = 0;
for (int y = 0; y < h; y++) {
int red = (y * 255) / (h - 1);
for (int x = 0; x < w; x++) {
int green = (x * 255) / (w - 1);
int blue = 128;
rgb2[i++] = (red << 16) | (green << 8) | blue;//the problem is at this line
}
}
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
image.setRGB(0, 0, w, h, rgb2, 0, w);
Graphics g = image.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
File imageFile = new File("saved.jpeg");
ImageIO.write(image, "jpg", imageFile);
}
我在循环外声明后出现此错误。 线程&#34; main&#34;中的例外情况java.lang.Error:未解决的编译问题: 局部变量rgb1可能尚未初始化
int w = img1.getWidth();
int h = img1.getHeight();
int scale = w * h * 3;
int rgb1[] = img1.getRGB(0, 0, w, h, rgb1, 0, w);
int rgb2[] = img2.getRGB(0, 0, w, h, rgb2, 0, w);
答案 0 :(得分:2)
您的问题是因为rgb2[]
在紧接之前的for循环中声明,在此行中:
int rgb2[]= img2.getRGB(x, y, w, h, rgb2, 0, w);
然后for循环结束,因此rgb2[]
超出范围并从内存中释放,不再定义。如果希望从循环外部访问rgb2[]
,则必须在调用循环之前说int rgb2[];
,以便变量与需要调用的行在同一范围内。请记住,范围是向下继承的 - 在循环可以在其中访问之前可以访问的任何东西 - 但不是相反。
答案 1 :(得分:0)
你在你的第一个for循环中声明了你的rgb2变量,这对你的第二个for循环是不可见的,在那里出现问题。要修复它,只需在for循环之前声明rgb2数组。