如何从输出流制作缓冲图像



我开始使用LLJTran对JPEG图像进行无损旋转。我对这个库的唯一问题是它的迭代面。

理想情况下,transform(( 将返回 BufferedImage 对象,但它不返回任何内容,只写入 OutputStream。

这是 API。http://mediachest.sourceforge.net/mediautil/javadocs/mediautil/image/jpeg/LLJTran.html

有谁知道我如何从输出流中获取缓冲图像?

有谁知道我如何从输出流中获取缓冲图像?

  1. 创建ByteArrayOutputStream
  2. 从操作系统读取字节,写入 BAOS。
  3. 完成后,BAOS 将包含所有字节。 使用BAOS.toByteArray()获取byte[]
  4. byte[]作为参数返回给ByteArrayInputStream的构造函数。
  5. 通过BAIS到ImageIO.read(InputStream)
OutputStream os = new FileStream(​strFilePath, FileMode.Create);
InputStream is = new ByteArrayInputStream(os.toByteArray());
BufferedImage bi = ImageIO.read(is);

从字面上看,只有 3 行代码。不知道我们为什么要让彼此为难。

使用ImageIO.read(InputStream input)

尝试自己进行旋转,因为无论如何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 );

您是否尝试过使用 BasicJpegLLJTran 的子类?
它有一个getBufferedImage()的方法,但文档不是那么冗长......而且我不知道 API。

如果这不起作用,您可以让LLJTran写入连接到PipedInputStreamPipedOutputStream,该将按照 AlexR 的建议为ImageIO馈送。

最新更新