字节数组转换为Java/Scala图像。性能考虑

5

我正在编写一个FTP服务器,用于接收图片并将其调整大小后上传。

我的当前流程(伪代码)如下:

val imagesAsBytes: Array[Byte] = ...
val bufferedImage: BufferedImage = ImageIO.read(new ByteArrayInputStream(bytes))
uploadImage(bufferedImage)

这就是要点。我没有涉及调整大小,因为它不重要。基本上,我使用ImageIO模块将Array[Byte]串行化为BufferedImage,然后调整大小。
我已经进行了一些分析,发现使用ImageIO创建BufferedImage非常慢。
如果我只上传Array[Byte],我可以实现大约4倍的吞吐量,而不是实际尝试将其转换为BufferedImage。我不能只上传Array[Byte]的原因是我需要调整图片的大小。我并不局限于BufferedImage,这只是我的第一个尝试。
有人知道我可以使用哪些想法来加速这个过程吗?是否有更好的格式应该优于BufferedImage
我已经考虑将调整大小推迟到单独的微服务中,并进行异步处理,但这不是第一次发布的选择。
编辑:我已经审查了问题,并知道这一点:ImageIO.setUseCache(false)

这个有帮助吗?http://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html - Allison
根据你提供的数据,我认为解码图像、重新采样(调整大小)并最终再次编码不能被视为缓慢(4倍)。实际上,与仅复制字节相比,它非常快速...或者是与仅解码相比?无论如何,你使用的文件格式是什么?有些格式比其他格式更重,需要更多的编码/解码时间。 - Harald K
2个回答

1
我建议您查看更多受到积极支持的库(最近一次发布为2020年2月的4.0版本),例如scrimage。在底层,它使用java.awt.*。至少在出现任何问题时,您将能够解决它们并获得解决方案,而且使用更多“Scalish”API。

希望这有所帮助。


0

使用ImageMagic的外部程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接