我开始使用LLJTran对JPEG图像进行无损旋转。我对这个库的唯一问题是它的迭代面。
理想情况下,transform(( 将返回 BufferedImage 对象,但它不返回任何内容,只写入 OutputStream。
这是 API。http://mediachest.sourceforge.net/mediautil/javadocs/mediautil/image/jpeg/LLJTran.html
有谁知道我如何从输出流中获取缓冲图像?
有谁知道我如何从输出流中获取缓冲图像?
- 创建
ByteArrayOutputStream
- 从操作系统读取字节,写入 BAOS。
- 完成后,BAOS 将包含所有字节。 使用
BAOS.toByteArray()
获取byte[]
。 - 将
byte[]
作为参数返回给ByteArrayInputStream
的构造函数。 - 通过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 );
您是否尝试过使用 BasicJpeg
,LLJTran
的子类?
它有一个getBufferedImage()
的方法,但文档不是那么冗长......而且我不知道 API。
如果这不起作用,您可以让LLJTran
写入连接到PipedInputStream
的PipedOutputStream
,该将按照 AlexR 的建议为ImageIO
馈送。