【问题标题】:How to make BufferedImage from OutputStream如何从 OutputStream 制作 BufferedImage
【发布时间】:2021-06-11 18:58:47
【问题描述】:

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

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

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

有人知道我如何从 OutputStream 中获取 BufferedImage 吗?

【问题讨论】:

  • 如果您想要的只是BufferedImage,为什么不自己轮换呢?请注意,BufferedImage 包含未压缩的数据,因此支持无损旋转。看起来 LLJTran 会在 OutputStream 中返回重新压缩的 JPEG 数据,因此您必须再次解压缩才能获得 BufferedImage
  • 我不确定,但是当我将 OutputStream 保存到文件时,我得到了完美旋转的图像,我认为它根本没有被压缩。我只是不想保存到文件然后从文件中读回。我想使用流只是不知道如何。我对 Java 中的 Streams 还很陌生
  • 如果您只是将 OutputStream 写入文件,并且无需做更多操作即可获得完美的 JPEG 文件,那么它肯定包含压缩数据。正如我所说,将 JPEG 读入未压缩的 BufferedImage 并自行旋转。

标签: java bufferedimage


【解决方案1】:

有人知道我如何从 OutputStream 中获取 BufferedImage 吗?

  1. 创建ByteArrayOutputStream
  2. 从操作系统读取字节,写入 BAOS。
  3. 完成后,BAOS 将包含所有字节。使用BAOS.toByteArray() 获取byte[]
  4. 将作为参数返回的byte[] 交给ByteArrayInputStream 的构造函数。
  5. 将 BAIS 传递给 ImageIO.read(InputStream)

【讨论】:

  • 我会试试的。你知道我是否可以改用 ImageOutputStream 吗?我的意思是,有没有办法使用 ImageOutputStream 作为 OutputStream 的对象来输出将被写入 ImageOutputStream?
  • 我不知道,但有什么优势?
【解决方案2】:
OutputStream os = new FileStream(​strFilePath, FileMode.Create);
InputStream is = new ByteArrayInputStream(os.toByteArray());
BufferedImage bi = ImageIO.read(is);

实际上只有 3 行代码。不知道我们为什么要互相刁难。

【讨论】:

  • OutputStream' 是抽象的;无法实例化
  • 谢谢@ozer
【解决方案3】:

使用ImageIO.read(InputStream input)

【讨论】:

  • 我不明白。我从哪里获得 InputStream?你能写出完整的代码吗?我需要创建一些类型输出的 OutputStream 对象,其中包含底层的 INputStream 对象。那正确吗?我该怎么做?
  • AlexR,这意味着写入文件然后从中读取,这两个步骤可能不如写入“管道”并同时从中构建 BufferedImage 高效。跨度>
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    如果这不起作用,您可以让 LLJTran 写入连接到 PipedInputStreamPipedOutputStream,这将按照 AlexR 的建议提供 ImageIO

    【讨论】:

    • 试过了。不工作。 getBufferedImage() 给出错误,与 im == null 有关。除了我喜欢 LLJTran 库之外,它是唯一一个将我的大型 jpeg 旋转 90 度而没有任何问题的库
    猜你喜欢
    • 2013-07-01
    • 2017-12-14
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2021-04-05
    • 2012-07-11
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多