在java中获取webp图像大小

时间:2016-02-24 22:16:34

标签: java webp

我需要在经典java中提取webp图像的宽度和高度

我搜索了图书馆并找到了webp-imageio,但它无法提取图片大小

对于像jpg / png / gif这样的其他格式我使用ImageIO只从标题中提取大小(但不幸的是它无法处理webp)

我如何使用webp执行相同操作?

此致

3 个答案:

答案 0 :(得分:1)

该项目webp-imageio-core可能会对您有所帮助。 它集成了Webp转换器本机系统libs(dll / so / dylib)。

下载并导入到您的项目中。示例代码:

 public static void main(String args[]) throws IOException {
        String inputWebpPath = "test_pic/test.webp";
        String outputJpgPath = "test_pic/test_.jpg";
        String outputJpegPath = "test_pic/test_.jpeg";
        String outputPngPath = "test_pic/test_.png";

        // Obtain a WebP ImageReader instance
        ImageReader reader = ImageIO.getImageReadersByMIMEType("image/webp").next();

        // Configure decoding parameters
        WebPReadParam readParam = new WebPReadParam();
        readParam.setBypassFiltering(true);

        // Configure the input on the ImageReader
        reader.setInput(new FileImageInputStream(new File(inputWebpPath)));

        // Decode the image
        BufferedImage image = reader.read(0, readParam);

        ImageIO.write(image, "png", new File(outputPngPath));
        ImageIO.write(image, "jpg", new File(outputJpgPath));
        ImageIO.write(image, "jpeg", new File(outputJpegPath));

    }

然后,您可以使用ImageIO从标题中提取大小。

答案 1 :(得分:0)

Apache Tika使用此metadata extractor library来读取webp的元数据,因此也许它也适合您的需求。

答案 2 :(得分:0)

来自我的answer here

Webp Container Sepcs定义当前使用的Webp Extended File Format图像在开头几位具有标头,这些标头对应于类型,文件大小,是否存在alpha,是否存在动画,高度和宽度等

尽管文档似乎已经过时了(它表明height和width的值对应于索引20到25,但我发现它在24到29个索引上)。

public class JavaRes {
    public static java.awt.Dimension extract(InputStream is) throws IOException {
        byte[] data = is.readNBytes(30);
        if (new String(Arrays.copyOfRange(data, 0, 4)).equals("RIFF") && data[15] == 'X') {
            int width = 1 + get24bit(data, 24);
            int height = 1 + get24bit(data, 27);

            if ((long) width * height <= 4294967296L) return new Dimension(width, height);
        }
        return null;
    }

    private static int get24bit(byte[] data, int index) {
        return data[index] & 0xFF | (data[index + 1] & 0xFF) << 8 | (data[index + 2] & 0xFF) << 16;
    }
}

另请参阅:Parsing webp file header in Kotlin to get its height and width, but getting unexpected results