Преобразование байт-массива в изображение на Java - без знания типа

Звучит просто так? Используйте

ImageIO.read(new ByteArrayInputStream(bytes));

Вот морщина. По какой-то причине он обнаруживает jpeg как bmp, и это первый ImageReader, возвращаемый при вызове

ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(bytes));
Iterator<ImageReader> readers=ImageIO.getImageReaders(iis);

Это приведет к повреждению изображения. Есть ли способ рассказать через java, не глядя прямо на байты для заголовка, и не удается ли кому-нибудь узнать хорошую ссылку для заголовков байтов для разных изображений?

Просто позвольте вам, ребята, знать, что я все еще работаю над этим. Я дам вам знать, если/когда у меня будет ответ. Я благодарю всех вас за ваши ответы.

Ответы

Ответ 1

Эта страница может быть хорошей отправной точкой для магических чисел. Здесь что-то похожее из Википедии.

Ответ 2

Не играл с ImageIO через некоторое время и не тестировал это, но, похоже, я вспоминаю что-то вроде этого. (так как вы говорите, что знаете, что ваш файл - это jpg, а не растровое изображение, я использую эту информацию, чтобы найти нужного загрузчика).

String inFormat = "jpg";

Iterator inReaders = ImageIO.getImageReadersByFormatName(inFormat);

...

nextInReader.setInput( iis );

Ответ 4

Является ли читатель BMP единственным, возвращаемым getImageReaders()? Возможно, вы получаете больше одного и можете сделать выбор на основе этого.