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

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

ImageIO.read(new ByteArrayInputStream(bytes));

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

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

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

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


person PHeath    schedule 31.07.2009    source источник
comment
Эта страница может стать хорошей отправной точкой для магии числа. Вот что-то похожее из Википедии.   -  person R Ubben    schedule 31.07.2009


Ответы (3)


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

String inFormat = "jpg";

Iterator inReaders = ImageIO.getImageReadersByFormatName(inFormat);

...

nextInReader.setInput( iis );
person jedierikb    schedule 31.07.2009
comment
Это правильно, но проблема в том, что сбор данных представляет собой смесь bmp, png, jpg и т. д. Таким образом, любой из них МОЖЕТ быть действительным, хитрость заключается в том, чтобы сказать, какой из них основан исключительно на байтах. - person PHeath; 31.07.2009

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

person mic.sca    schedule 31.07.2009

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

person Michael Borgwardt    schedule 31.07.2009