今日需求,超大图片处理 imagick boom

今日收到一个用户上传了一个超大图片到服务器,然后得到错误 width or height exceeds limit @ error/cache.c/OpenPixelCache/3912,一看设备:Linux; Android 14; 23090RA98C Build/UP1A.231005.007; wv, REDMI NOTE 13 PRO+,居然整了一个这么大的图片。

{
    "0": 12240,
    "1": 16320,
    "2": 2,
    "3": "width="12240" height="16320"",
    "bits": 8,
    "channels": 3,
    "mime": "image/jpeg"
}

模拟测试:生成图片

# imagick 生成测试
# convert -size 12240x16320 xc:black input.jpg
convert-im6.q16: width or height exceeds limit `black' @ error/cache.c/OpenPixelCache/3909.
convert-im6.q16: no images defined `input.jpg' @ error/convert.c/ConvertImageCommand/3229.

# imagick 缩放
# 不用试了,肯定不行

# graphicsmagick 生成测试(2G RAM)
# gm convert -size 12240x16320 xc:black input.jpg
Killed

# graphicsmagick 生成测试 (64G RAM, 实际需要内存未测试)
# gm convert -size 12240x16320 xc:black input.jpg
# gm identify input.jpg
input.jpg JPEG 12240x16320+0+0 PseudoClass 256c 8-bit 762.2Ki 0.000u 0m:0.000001s

# graphicsmagick 缩放测试(2G RAM)
# gm convert input.jpg -resize 2000x output.jpg
Killed

# graphicsmagick 缩放测试(64G RAM)
OK

最终的结果就是,在生产环境小内存下, imagick 和 graphicsmagick 均无法满足需求。

最后,上终极方案,使用ffmpeg进行缩放。

apt update
apt install ffmpeg

ffmpeg -i input.jpg -vf scale=2000:-1 output.jpg
# success

弊端, ffmpeg太重了,对于一个小项目来说,不过解决了就行,客户端不压缩就上传的毛病,暂时无解。

当前还没有任何评论

写下你最简单的想法