今日收到一个用户上传了一个超大图片到服务器,然后得到错误 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"
}
"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
# 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
apt install ffmpeg
ffmpeg -i input.jpg -vf scale=2000:-1 output.jpg
# success
弊端, ffmpeg太重了,对于一个小项目来说,不过解决了就行,客户端不压缩就上传的毛病,暂时无解。
当前还没有任何评论