jpa 将图像压缩为字节数组

yzuktlbb  于 5个月前  发布在  其他
关注(0)|答案(3)|浏览(86)

过了一段时间,在对我的数据库和它的REST API进行压力测试后,出现了以下问题。
我们通过JPA/Hibernate将图像保存为Mysql数据库中的字节数组,注解如下:

@Column(columnDefinition = "MEDIUMBLOB")
private byte[] photo;

字符串
工程,因为它应该除了当有很多高品质的图像,我想检索所有的人。然后响应时间太长和事件** Postman 卡住**。
所以我寻找一个解决方案,使这些字节数组更小。有没有办法**压缩图像作为字节数组?**或者另一种方法会更好,也许分页(在我看来,这不是我们必须解决的任务的最佳方法)?
先谢了。

q43xntqr

q43xntqr1#

我假设你面临的问题是你在同一个查询中读取了很多图像,它们占用了太多的内存,导致垃圾收集和其他问题。压缩图像不会有帮助,因为你会想在将它们返回给客户端之前再次对它们进行压缩,而且大多数图像格式已经被压缩了。
你可以考虑流式处理,在这种情况下,你不会把所有匹配的图像从数据库读入内存,而是一次处理一个。确保你把你发送到客户端的数据也流式处理。如果你做得对,你可以保持内存使用率低,你可以在读取其他图像之前把第一个图像发送到客户端,减少到第一个字节的时间并使响应看起来很快。
或者,按照其中一条评论的建议,首先读取Meta数据,然后每次读取一个图像的完整图像数据。

flseospp

flseospp2#

如果图像是JPEG格式,则可以在所需的每个级别上进行照片质量压缩:高压缩和低质量。您可以/应该限制图像大小(宽度和高度)。请参阅ImageIO的ImageWriter和质量设置。
对于BLOB,您应该添加:

@Lob
@Column(columnDefinition = "MEDIUMBLOB")
private byte[] photo;

字符串
可能的情况是,最好将图像字段放在自己的数据库表中,这样查询原始表的速度会快得多。
如前所述,还可以将图像存储在文件系统上,可能在生成的唯一ID下:

UUID uuid = UUID.randomUUID();
String fileName = uuid.toString() + ".jpg";


一般来说,使用byte[]字段或本地对象是次优的,因为它不必要地占用服务器的内存。立即阅读和写入响应更好-在JPA之外。如果你想在数据库中的东西,也许可以使用本机查询。

uidvcgyl

uidvcgyl3#

四年过去了,没有人真正回答这个问题。
这是如何做到这一点使用“缩略图”-图书馆(net.coobird.thumbnailator)。

public static byte[] compress(byte[] binaryData, double scale, double quality) {
    if (binaryData != null) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            Thumbnails.of(new ByteArrayInputStream(binaryData)).scale(scale).outputQuality(quality)
                .toOutputStream(baos);
            return baos.toByteArray();
        }
        catch (Exception e) {
            // handle Exceptions
        }
    }
    return null;
}

字符串

相关问题