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

Звучит просто, правда? использование

ImageIO.read(new ByteArrayInputStream(bytes));

Вот морщина. По какой-то причине он обнаруживает JPEG в качестве BMP, и это первый ImageReader, возвращенный, когда я звоню

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

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

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

3 ответа

Решение

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

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

String inFormat = "jpg";

Iterator inReaders = ImageIO.getImageReadersByFormatName(inFormat);

...

nextInReader.setInput( iis );

Для справки вы можете взглянуть на википедию, вы можете найти там заголовки различных форматов.
http://en.wikipedia.org/wiki/Graphics_Interchange_Format
http://en.wikipedia.org/wiki/BMP_file_format
http://en.wikipedia.org/wiki/JPEG

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

Другие вопросы по тегам