如何从图像中读取颜色

时间:2014-03-12 00:18:04

标签: java javax.imageio

这是我调用程序来读取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]);
    }

当我运行它时,它不会打印我编码的数字。我怎么能解决这个问题?如何阅读颜色?

1 个答案:

答案 0 :(得分:1)

如果你没有得到任何输出,那么你的println行没有到达或者(不太可能)你的控制台配置隐藏输出有问题。 我们将假设,正确地说,这里调用的所有方法总是返回或抛出(即没有任何东西挂起)。假设前者,我认为唯一的机会就是图像无法加载并返回。

由于您打印了任何异常的堆栈跟踪但没有报告查看堆栈跟踪,这意味着ImageIO.read()必须返回null。为此,根据the documentation

  

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

我知道一般都支持PNG,但也许你的PNG的特定风格不是(例如压缩的4色调色板等等;我不知道ImageIO的限制是什么) 。我建议您尝试以不同的格式保存图像,或使用更基准的PNG格式进行测试(例如,未压缩的24位,无透明度,无隔行扫描)。

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

如果我不正确,我建议您在方法中删除一些调试打印输出,或者在调试器中逐步执行以查看为什么这些println行没有被执行。