图片尺寸 1200x900 缩小到 800x600 有办法更清晰吗?(图片查看工具 100%>75%是更清晰的)

2020-11-18 09:39:14 +08:00
 wzw
目前用图片查看器缩小是会看得更清晰,100% > 75%的时候是更清晰的。 但是用 pillow 的 resize 就惨不忍睹了。

1200x900 缩小到 800x600 或者 600x450

有什么办法, 用 python 实现吗?

原图:
2977 次点击
所在节点    问与答
37 条回复
jdhao
2020-11-18 09:47:57 +08:00
resize 的时候是有 filter 参数可调节的,查一下,换一个高精度的 filter,默认的 filter 不行的
wzw
2020-11-18 09:53:37 +08:00
@jdhao #1 https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.resize

请问你说的哪个参数, 我试过网上说的一些
wzw
2020-11-18 09:55:09 +08:00
@jdhao #1 基本都是说 Image.ANTIALIAS, 但是无效
jdhao
2020-11-18 10:00:16 +08:00
@wzw 用 PIL 的话,PIL.Image.LANCZOS,这个精度应该是最高的,速度最慢
jdhao
2020-11-18 10:00:43 +08:00
@jdhao 或者 bicubic 也试一下
songzhengqian
2020-11-18 10:16:35 +08:00
个人观点:从大尺寸变为小尺寸分辨率就会降低,相当于压缩了。
wzw
2020-11-18 10:17:21 +08:00
@jdhao #4 @jdhao #5 LANCZOS/bicubic 效果都还是很模糊

请看结果
wzw
2020-11-18 10:18:12 +08:00
@songzhengqian #6 但是 图片查看器缩小是会看得更清晰,100% > 75%、50%的时候是更清晰的

是不是需要提升 dpi
jdhao
2020-11-18 10:33:06 +08:00
@wzw Let me see see. 等会给你结果。
ipwx
2020-11-18 10:39:13 +08:00
要不要试试输出 pdf 。。。
jifengg
2020-11-18 10:48:34 +08:00
倒是没有看出缩小的时候哪里更清晰了。
不过发现 v 站的图床,png 图片缩放之后尺寸反而大了,原图 20K,贴出来的大图是 80K 。 @livid
xiangyuecn
2020-11-18 10:52:59 +08:00
无法正确表达 0.49 像素,四舍五入为 0,普通缩放的时候那些斜线最容易丢失😂

也许有专业的缩放工具,专门缩放线条曲线,图片缩放的时候线条粗细保持不变😂
wzw
2020-11-18 11:39:00 +08:00
@jdhao #9 等你结果,谢谢

@ipwx #10 一定要图, 要插入到 word 用

@jifengg #11 你用看图软件打开, 然后 100%》 50%试试

@xiangyuecn #12 目前就是想和看图软件一样缩放就行
wzw
2020-11-18 11:40:37 +08:00
@jifengg #11 我也觉得奇怪, 应该这样看才是对的, 才是原图:

https :// i.v2ex.co / CS69YwBh.png

zhoushiya
2020-11-18 11:54:51 +08:00
wzw
2020-11-18 11:56:59 +08:00
@zhoushiya #15 请问你是如何做到的, 谢谢!
zhoushiya
2020-11-18 11:59:33 +08:00
@wzw #16 做图软件 firework 缩放的。。。。。。它也可以设置批处理脚本,你如果有大量图可以用批处理
wzw
2020-11-18 12:03:19 +08:00
@zhoushiya #17 😂, 我也知道 firework 可以实现, 想要的效果就是这样的。

可是我需要用 python 或者其他编程语言来处理,firework 不方便了。。。
also24
2020-11-18 12:10:24 +08:00
非整数倍的缩放,我一般习惯先放大再缩小,这是先将图片拉伸到 2400*1800,再缩小到 800*600 的效果。

https://i.loli.net/2020/11/18/D2hibEvwmM1VLUN.png
jdhao
2020-11-18 12:10:37 +08:00
@wzw 我试了 PIL 的所有 resample filter,似乎都不行,出来的都是模糊的,另外 Image.ANTIALIAS == Image.LANCZOS 。

不过 opencv 的 resize 效果还行,下面是可运行的代码:

import cv2

def main():
im = cv2.imread('big_image.png')
im_resize = cv2.resize(im, (800, 600), interpolation=cv2.INTER_LANCZOS4)
write_param = [cv2.IMWRITE_PNG_COMPRESSION, 5]
cv2.imwrite('big-resized.png', im_resize, write_param)


if __name__ == "__main__":
main()


上面的 interpolation 类似 PIL 中的 resample filter,除了 cv2.INTER_LANCZOS4,还可以试试 cv2.INTER_AREA,这俩出来的效果比较接近。还有一点值得注意的是,你给的原图只有 20kb 左右,opencv 出来的图片文件大小变大了不少,应该是压缩算法导致的,上面 wirte_param 那行可以调整压缩比例,最高 9,但是压缩下来的图片还是比原图大了不少。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/726518

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX