【发布时间】:2021-01-11 14:33:17
【问题描述】:
我有一个ReadableByteChannel,其中包含一个图像(从 URL 或文件获取)。我最终将 Channel 写入一个文件,代码如下:
final FileOutputStream fileOutputStream = new FileOutputStream(outImageName);
fileOutputStream.getChannel().transferFrom(imageByteChannel, 0, Long.MAX_VALUE);
fileOutputStream.close();
由于不清楚图像是png 还是jpeg 还是...我想确定并将其保存为png。我知道我可以使用ImageIO.write(buffImg, outImageName, "png");
但不知何故,这要求buffImg 是RenderedImage,这就提出了如何获得它的问题?
有没有比使用ImageIO 从文件系统读取文件并将其写为png 更简单的解决方案?可以直接在内存中转换吗?
另外还有一个问题:有没有办法告诉ImageIO 摆脱 AlphaChannel(=透明)?
【问题讨论】:
-
我会选择 (1) - 但我遇到的主要问题是我不知道如何使用
ImageIO而不先将OutputStream写入File然后阅读从那里开始。我宁愿不写不读就这样做——即直接。 -
如果可以,获取
InputStream或底层File或URL而不是ReadableByteChannel,因为ImageIO.read(..)支持所有这些类型作为输入。如果不可能,您可以使用Channels.newInputStream(..)获取InputStream,您可以将其传递给ImageIO.read(...)。无需先写信给File。 -
您也可以以同样的方式回写到
OutputStream或可写Channel,而无需通过文件。 -
ImageIO.read(Channels.newInputStream(ReadableByteChannel))的想法做到了。我不知道如何将Channel转换为另一个。谢谢。 -
@LeO 我在上面的评论中添加了一些代码并作为答案发布 + 添加了关于摆脱 alpha 通道 + 写入文件的部分。
标签: java javax.imageio