2013-02-18 4 views
1

Я читаю файл с массивом байтов. Я скачал библиотеку Apache Commons IO использование метода FileUtils' readFileToByteArrayJava Converting ByteArray в изображение

File file = new File("/home/username/array.txt"); 
FileUtils fu = new FileUtils(); 
byte[] array = FileUtils.readFileToByteArray(file); 

Я хочу, чтобы преобразовать массив байтов в изображение.

ByteArrayInputStream bis = new ByteArrayInputStream(array); 
Iterator<?> readers = ImageIO.getImageReadersByFormatName("gif"); 

ImageReader reader = (ImageReader) readers.next(); 
Object source = bis; 

ImageInputStream iis = ImageIO.createImageInputStream(source); 

reader.setInput(iis, true); 
ImageReadParam param = reader.getDefaultReadParam(); 

Image image = reader.read(0, param); // this line is the problem 

Когда код переходит к упомянутой линии, он генерирует исключение, говоря

javax.imageio.IIOException: Unexpected block type 128! 

Я не знаю, что означает, что это исключение, поэтому я не знаю, как это исправить. Любая дополнительная информация, которая может быть полезной, должна быть запрошена.

Благодаря

+0

Вы можете сделать все вышеперечисленное с помощью одной строки кода: «Image image = ImageIO.read (file);» Это устранит любые проблемы с байт-массивами и удалит вашу зависимость от внешней библиотеки. – VGR

ответ

1

Я пробовал свой код на файле this, и он отлично работает.

Каков формат вашего array.txt? readFileToByteArray() ожидает двоичный формат, и ваш читатель изображений ожидает, что он будет GIF-файлом.

+0

Как вы получили byteArray? Может быть, я получаю не byteArray. –

+0

Ну, я полагаю, вопрос в том, как выглядит ваш файл, например. если он открыт в редакторе. '.txt' вызывает беспокойство. Если ваш файл выглядит как «123 22 55 98 ...», вам необходимо проанализировать значения, например.с помощью ['Scanner'] (http://docs.oracle.com/javase/6/docs/api/index.html?java/util/Scanner.html). – Vlad

+0

Ну, единственная строка, которую можно прочитать, - 'GIF89a'. Остальное нечитаемо любыми средствами. –

1

После того как вы byte[] вы можете использовать ImageIO, чтобы записать его в BufferedImage.

BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(array)); 
ImageIO.write(bImageFromConvert, "gif", new File("c:/test.gif")); 
+0

Я пробовал ваш подход, но результат был тем же самым исключением. –

1

Этот код означает, что читатель не смог расшифровать метаданные в файле изображения. Убедитесь, что правильный файл читается, и он хорошо сформирован. Или может ожидаться другой тип файла.

+0

Как я могу заверить, что файл хорошо сформирован? –

+0

Посмотрите, может ли этот файл изображения открываться другой программой. Предпочтительно тот, который не слишком прощает, или тот, который позволяет вам проверять метаданные. – WPrecht

+0

На самом деле, у меня нет изображения. У меня есть txt-файл с информацией, записанной внутри. –

0

без байт [] Я считаю, что это будет хорошо для многочастнога передачи файлов, для этого нам нужно APACHE общего опарника

final FileOutputStream output = new FileOutputStream("D:\\Dir\\"+ request.getParameter("imageName") + ".jpg"); 
     IOUtils.copy(request.getPart("file").getInputStream(), output); 
     output.close(); 
-1
@Transactional(readOnly = true) 
@RequestMapping(value = "/getStaticImage/{key}") 
public void getImageinByteArray(HttpServletResponse response, @PathVariable String key) throws IOException { 
    byte[] imageInBytes = yourService.getImageinBytes(key); 
    InputStream is = new BufferedInputStream(new ByteArrayInputStream(imageInBytes)); 
    IOUtills.copy(is, reposne.getOutputStream)); 
} 

В вашем JSP:

<img src="${ContextPath}/getImage/KeyForImage" alt="image"/> 
+0

почему -2 пункта здесь? – Ravi

Смежные вопросы