在没有ImageMagick或ImageIO的情况下,在Java中验证合理的图像尺寸

时间:2015-09-03 13:05:10

标签: java image imagemagick javax.imageio

我有一个使用ImageMagick处理图像的东西。 ImageMagick有一个可重现的错误,导致它或多或少地将系统锁定在某些错误的大图像上:

https://hackerone.com/reports/390

为了避免这种情况,我使用ImageIO在将图像发送到ImageMagick之前加载图像,因为ImageIO.read()在找到荒谬的像素数时会爆炸(它会抛出异常并显示消息:“width * height> Integer.MAX_VALUE!“)。

问题是ImageIO不像ImageMagick那样容忍腐败或形成不良的图像,我不想追逐并处理ImageMagick处理的已知和未知边缘情况。

我希望在不使用ImageMagick的加载或ImageIO.read()的情况下验证JPEG,PNG,TIF,ICO和GIF图像的合理尺寸。如果需要,我可以限制为50 MP。

1 个答案:

答案 0 :(得分:1)

使用ImageIO获取ImageReader,然后查询ImageReader的宽度和高度,而不实际加载图片。

try (ImageInputStream stream = ImageIO.createImageInputStream(input)) {
    Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);
    if (readers.hasNext()) {
        ImageReader reader = readers.next();
        reader.setInput(stream);

        // Get width/height of first image in file
        // (alternatively, use getNumImages() and loop over all images)
        int w = reader.getWidth(0);
        int h = reader.getHeight(0);

        if (w * h > SANE_MAX_SIZE) {
            // TODO: Handle image too large
        }
    }
}

但是,您可能仍然遇到ImageIO的容错能力较差的问题。

我建议使用我自己的TwelveMonkeys ImageIO插件(支持TIFF,ICO并添加更好的JPEG支持),但我想你也可以使用Apache Commons Imaging或其他库。

最后的办法是编写代码来自行解析所有这些格式。但是我觉得错误比现有解决方案少的可能性很小,没有相当大的努力......; - )