这是我调用程序来读取SpriteSheet的地方,这是另一个类。
private SpriteSheet spriteSheet = new SpriteSheet("/sprite_sheet.png");
这是我尝试从黑色,深灰色,浅灰色和白色着色的精灵表中读取像素颜色的地方。这是为了打印第一行像素的颜色细节。
public SpriteSheet(String path) {
BufferedImage image = null;
try {
image = ImageIO.read(SpriteSheet.class.getResourceAsStream(path));
} catch (IOException e) {
e.printStackTrace();
}
if(image==null){
return;
}
this.path = path;
this.width = image.getWidth();
this.height = image.getHeight();
pixels = image.getRGB(0, 0, width, height, null, 0, width);
for(int i = 0; i<pixels.length;i++){
pixels[i] = (pixels[i] & 0xff)/64;
}
for(int i=0; i<8;i++){
System.out.println(pixels[i]);
}
当我运行它时,它不会打印我编码的数字。我怎么能解决这个问题?如何阅读颜色?
答案 0 :(得分:1)
如果你没有得到任何输出,那么你的println
行没有到达或者(不太可能)你的控制台配置隐藏输出有问题。 我们将假设,正确地说,这里调用的所有方法总是返回或抛出(即没有任何东西挂起)。假设前者,我认为唯一的机会就是图像无法加载并返回。
由于您打印了任何异常的堆栈跟踪但没有报告查看堆栈跟踪,这意味着ImageIO.read()
必须返回null
。为此,根据the documentation:
InputStream包装在ImageInputStream中。如果没有已注册的ImageReader声称能够读取生成的流,则返回null。
我知道一般都支持PNG,但也许你的PNG的特定风格不是(例如压缩的4色调色板等等;我不知道ImageIO
的限制是什么) 。我建议您尝试以不同的格式保存图像,或使用更基准的PNG格式进行测试(例如,未压缩的24位,无透明度,无隔行扫描)。
如果我的分析是正确的,那么这个故事的寓意是:改善你的错误处理。不要默默地失败;特别是在执行对程序正常运行至关重要的任务时。
如果我不正确,我建议您在方法中删除一些调试打印输出,或者在调试器中逐步执行以查看为什么这些println
行没有被执行。