Невозможно записать файл tif с контроллера с помощью ImageIO

У меня есть банка jai-imageio, и я добавил ее в свой путь к классу. Я просто не знаю, как записать изображение .tif в выходной поток ответа. Кто-нибудь может мне помочь?

Вот мой код:

RenderedOp image = JAI.create("fileload", filepath);
ImageIO.write(image.getAsBufferdImage(), "tif", response.getOutputStream());

Я знаю, что javax.imageio.ImageIO не поддерживает изображения в формате tif, так что же мне сделать с jai-imageio, чтобы он заработал? Я потерялся.

Примечание: приведенный выше код отлично работает для других типов изображений, таких как jpeg и png.


person dmoss18    schedule 08.10.2012    source источник
comment
Почему именно вам нужна поддержка изображений TIF, если она работает для вас с PNG?   -  person BalusC    schedule 09.10.2012
comment
Поскольку пользователи загружают изображения, обычно это изображения в формате tif, но мы поддерживаем форматы tif, png и jpeg, и я пытаюсь передать им обратно загруженное ими изображение.   -  person dmoss18    schedule 09.10.2012
comment
Ой? Вы манипулируете загруженными изображениями? (например, изменить размер, отрезать, наклонить, повернуть и т. д.)? В противном случае я действительно не вижу причин использовать Java2D API таким образом, чтобы просто передавать загруженное изображение обратно.   -  person BalusC    schedule 09.10.2012
comment
Что бы вы использовали для потоковой передачи обратно?   -  person dmoss18    schedule 09.10.2012
comment
Просто прочитайте/запишите байты без изменений.   -  person BalusC    schedule 09.10.2012
comment
По сути, у меня есть html ‹img /›, src=url/to/image/streaming/action Будет ли потоковая передача байтов назад каким-либо образом нарушать эту функциональность?   -  person dmoss18    schedule 09.10.2012


Ответы (1)


Похоже, вы идете в неправильном направлении в отношении хранения и обслуживания загруженных изображений. Для этого вам вообще не нужен весь Java 2D API.

Когда вы получаете загруженное изображение, просто выполните

InputStream input = uploadedFile.getInputStream();
OutputStream output = new FileOutputStream(uniqueImagePath);
// Now write input to output in a loop the usual way.

Когда вы показываете загруженное изображение, просто выполните

InputStream input = new FileInputStream(uniqueImagePath);
OutputStream output = response.getOutputStream();
// Now write input to output in a loop the usual way.

Вам вообще не нужно массировать/манипулировать байтами. Просто транслируйте их без изменений.

person BalusC    schedule 08.10.2012
comment
Если у меня есть html ‹img src=url/to/image/streaming/action /›, будет ли изображение по-прежнему отображаться при использовании вашего подхода? - person dmoss18; 09.10.2012
comment
поэтому я делаю то, что вы предлагаете, заканчивая IOUtils.copy(ввод, вывод), но я получаю socketException: Connection reset by peer: ошибка записи сокета. Вы знаете, что это может означать? - person dmoss18; 09.10.2012
comment
Клиент отменил запрос. Может иметь множество причин. Например. клиент нажал клавишу Esc, или сын клиента перерезал сетевой кабель, или клиентская машина загорелась от молнии и т. д. Проблема не в сервере. - person BalusC; 09.10.2012
comment
Вот пример для обслуживания изображений из БД, он также может оказаться полезным: database-in-a-jsp-page/2341322#2341322" title="как извлекать и отображать изображения из базы данных на странице jsp"> stackoverflow.com/questions/2340406/ - person BalusC; 09.10.2012
comment
Ваши предложения сработали. Оказывается, некоторые браузеры просто не могут отображать изображения в формате tiff, поэтому я в конечном итоге конвертировал их в jpeg перед потоковой передачей. Принятие этого ответа. - person dmoss18; 11.10.2012