Подтвердить что ты не робот

Java: BufferedImage для байтового массива и обратно

Я вижу, что у ряда людей была аналогичная проблема, однако я еще не пытался найти именно то, что я ищу.

Итак, у меня есть метод, который считывает входное изображение и преобразует его в массив байтов:

    File imgPath = new File(ImageName);
    BufferedImage bufferedImage = ImageIO.read(imgPath);
    WritableRaster raster = bufferedImage .getRaster();
    DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();

Теперь я хочу преобразовать его в BufferedImage (у меня есть приложение, для которого мне нужна эта функция). Обратите внимание, что "test" - это массив байтов.

    BufferedImage img = ImageIO.read(new ByteArrayInputStream(test));
    File outputfile = new File("src/image.jpg");
    ImageIO.write(img,"jpg",outputfile);

Однако это возвращает следующее исключение:

    Exception in thread "main" java.lang.IllegalArgumentException: im == null!

Это потому, что BuffedImage img имеет значение null. Я думаю, что это связано с тем, что в моем первоначальном преобразовании из массива BufferedImage в байт информация изменяется/теряется, так что данные больше не могут быть распознаны как jpg.

Есть ли у кого-нибудь предложения по тому, как это решить? Было бы очень благодарно.

4b9b3361

Ответ 1

Рекомендуется преобразовать в массив байтов

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
byte[] bytes = baos.toByteArray();

Ответ 2

Обратите внимание, что вызов close или flush ничего не сделает, вы можете это увидеть сами, посмотрев на источник /doc:

Закрытие ByteArrayOutputStream не влияет.

Метод сброса OutputStream ничего не делает.

Таким образом, используйте что-то вроде этого:

ByteArrayOutputStream baos = new ByteArrayOutputStream(THINK_ABOUT_SIZE_HINT);
boolean foundWriter = ImageIO.write(bufferedImage, "jpg", baos);
assert foundWriter; // Not sure about this... with jpg it may work but other formats ?
byte[] bytes = baos.toByteArray();

Вот несколько ссылок относительно подсказки размера: