Как сделать BufferedImage из OutputStream - PullRequest
0 голосов
/ 23 августа 2011

Я начал использовать LLJTran для вращения JPEG изображения без потерь. Единственная проблема, с которой я столкнулся в этой библиотеке - это ее интерфейс.

В идеале transform () должен возвращать объект BufferedImage, но вместо этого он ничего не возвращает и просто записывает OutputStream.

Вот API. http://mediachest.sourceforge.net/mediautil/javadocs/mediautil/image/jpeg/LLJTran.html

Кто-нибудь знает, как я могу получить BufferedImage из OutputStream?

Ответы [ 4 ]

2 голосов
/ 24 августа 2011

Кто-нибудь знает, как я могу получить BufferedImage из OutputStream?

  1. Создать ByteArrayOutputStream
  2. Чтение байтов из ОС, запись в BAOS,
  3. По завершении BAOS будет содержать все байты.Используйте BAOS.toByteArray(), чтобы получить byte[].
  4. Вручите byte[], возвращенный в качестве аргумента конструктору ByteArrayInputStream.
  5. Передайте BAIS на ImageIO.read(InputStream).
0 голосов
/ 23 августа 2011

Попробуйте выполнить ротацию самостоятельно, поскольку BufferedImage в любом случае будет содержать несжатые данные. Таким образом, распакуйте файл JPEG в BufferedImage, что должно позволить вращение без потерь (из-за несжатых данных).

Пример:

File unrotatedImageFile = ...;
BufferedImage srcImage = ImageIO.read( unrotatedImageFile );

AffineTransformOp t = new AffineTransformOp( 
    AffineTransform.getRotateInstance( Math.toRadians( 90.0 ) ), 
    AffineTransformOp.TYPE_NEAREST_NEIGHBOR );
BufferedImage rotatedImage = t.filter( srcImage, null );
0 голосов
/ 23 августа 2011

Вы пытались использовать BasicJpeg, подкласс LLJTran?
У него есть метод getBufferedImage(), но документация не настолько многословна ... и я не знаю API.

Если это не сработает, вы можете разрешить LLJTran писать на PipedOutputStream, подключенном к PipedInputStream, который будет подавать ImageIO, как предложено AlexR.

0 голосов
/ 23 августа 2011

использование ImageIO.read(InputStream input)

...