Получить размер изображения webp в java

Мне нужно извлечь ширину и высоту изображения webp в классической java

Я искал библиотеки и нашел webp-imageio, но он не может извлечь размер изображения

Для других форматов, таких как jpg / png / gif, я использую ImageIO, который извлекает размер только из заголовков (но, к сожалению, он не может обрабатывать webp)

Как я могу сделать то же самое с webp?

С Уважением


person Bouki    schedule 24.02.2016    source источник


Ответы (3)


Этот проект webp-imageio-core может вам помочь. Он объединяет собственные системные библиотеки веб-конвертера (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, который извлекает размер из заголовков.

person Lin CS    schedule 09.09.2018

Из моего ответа здесь:

Контейнер Webp Sepcs определяет, что Изображения в расширенном формате файла Webp, которые используются в настоящее время, имеют заголовки в нескольких начальных битах, соответствующих типу , размер файла, есть ли альфа, есть ли анимация, высота, ширина и т. д.

Хотя документы кажутся устаревшими (они показывают, что значения высоты и ширины соответствуют индексам от 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;
    }
}

См. Также: Анализ заголовка файла webp в Kotlin, чтобы получить его высоту и ширину, но получение неожиданных результатов

person Animesh Sahu    schedule 28.11.2020

Apache Tika использует эту библиотеку экстрактора метаданных для чтения метаданных для webp, так что, возможно, она также соответствует вашим потребностям.

person wero    schedule 24.02.2016
comment
включение тики утроило бы мои зависимости только для одной маленькой функции - person Bouki; 25.02.2016
comment
Я намеревался рекомендовать компактную библиотеку извлечения метаданных, а не Tika (которая является монстром). Также вы должны исправить свой вопрос, что вы говорите только о неважной маленькой функции - это позволит людям сэкономить время. - person wero; 25.02.2016
comment
Я попробовал github.com/drewnoakes/metadata-extractor, он не работает для webp, только что нашел метаданные ( 0) для моего тестового изображения - person Bouki; 26.02.2016