在这里,我调用了该程序以读取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]);
    }


当我运行它时,它不会像我编码那样打印数字。我该如何解决?以及如何读取颜色?

最佳答案

如果您没有得到任何输出,则您的println行未达到或(极不可能)您的控制台配置出了点问题,它隐藏了输出。我们希望正确地假设在这里调用的所有方法总是返回或抛出(即没有任何东西挂起)。假设是前者,那么我看到的唯一机会就是如果无法加载图像而您返回。

由于您打印了所有异常的堆栈跟踪,但是没有报告看到堆栈跟踪,因此这意味着ImageIO.read()必须返回null。对于这种情况,根据the documentation


InputStream包装在ImageInputStream中。如果没有注册的ImageReader声称能够读取结果流,则返回null。


我确实知道一般都支持PNG,但可能不支持您所使用的PNG风格(例如压缩的4色调色板或其他内容;我不知道ImageIO的局限性在这里)。我建议您尝试以其他格式保存图像,或者使用更基准的PNG格式进行测试(例如未压缩的24位,无透明度,无隔行扫描)。

如果我的分析是正确的,那么这个故事的寓意是:改进错误处理。不要默默地失败;特别是在执行对程序正常运行至关重要的任务时。

如果我不正确,建议您要么在方法中删除一些调试打印输出,要么逐步进入调试器以查看为什么这些println行未得到执行。

关于java - 如何从图像中读取颜色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22339463/

10-11 23:02
查看更多