convert命令缩小再放大时尺寸不守恒 如何强制保持原始分辨率
尺寸偏差原因
当输入图像的边长不是10的整数倍时,第一步-scale 10%会将缩小后的图像尺寸取整到整数像素值,后续执行-resize 1000%放大时,是基于取整后的小尺寸计算放大结果,最终输出就会和原始尺寸存在1到数像素的偏差。
可行修复方案
最稳定的实现方式是在读取图像的第一时间记录原始宽高,模糊处理完成后强制将输出尺寸对齐到原始值,不需要依赖百分比换算,适配管道读写的命令如下:
convert - -set option:orig_size "%wx%h" -scale 10% -blur 0x2.5 -resize "%[orig_size]!" RGB:-
关键参数说明:
-set option:orig_size "%wx%h":刚读取输入流时就将原图的真实宽(%w)、高(%h)存入自定义变量,此时还未做任何缩放操作,拿到的尺寸完全准确-resize "%[orig_size]!":末尾的!是强制缩放标识,告诉ImageMagick不需要做等比自适应计算,严格将图像调整到记录的原始宽高值。由于前面的缩放、模糊操作都是等比进行的,加这个参数不会导致画面变形,只会补正像素取整带来的微小尺寸差,保证输出和输入尺寸完全一致。
注意:如果在Bash等Shell环境下执行命令遇到
!被解析为历史命令的问题,可以把最后一段的双引号换成单引号,写成-resize '%[orig_size]!'即可。
如果后续需要调整缩小比例(比如改成缩到20%再放大5倍提速),只需要修改对应scale的百分比即可,最后对齐原始尺寸的逻辑不需要改动,始终能保证输出尺寸匹配输入。
内容的提问来源于stack exchange,提问作者Milad
相关产品推荐
相关产品推荐

