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

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

1200x900 缩小到 800x600 或者 600x450

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

原图:
2999 次点击
所在节点    问与答
37 条回复
ipwx
2020-11-18 13:25:03 +08:00
@wzw 其实我指的是先 => pdf,然后用别的软件 => png 。哈哈哈
ipwx
2020-11-18 13:26:18 +08:00
pdf2png 你可以试试 imagemagick 。我反正日常用一个脚本:

#!/bin/bash
DPI="${DPI:-192}"
FROM="$1"
DST="$2"
BGARGS="$3"
if [ "${FROM}" = "" ]; then
echo "pdf2png from-file [to-file]"
fi
if [ "${DST}" = "-white" ]; then
DST=""
BGARGS="white"
fi
if [ "${DST}" = "" ]; then
DST="${FROM/.pdf/.png}"
fi
if [ "${BGARGS}" != "" ]; then
BGARGS="-background ${BGARGS} -alpha background -alpha remove"
fi
convert -density "${DPI}" -strip -trim "${FROM}" -quality 100 ${BGARGS} "${DST}"
futou
2020-11-18 13:53:52 +08:00
就几张图的话:图片查看器缩小 ->截图另存为 😂 笨办法也许更快
wzw
2020-11-18 13:54:31 +08:00
@ipwx #21 还要绕一次 pdf 呀,,,我目前方案首选图片直接处理吧,
wzw
2020-11-18 13:55:18 +08:00
@futou #23 很多很多, 必须集成到系统里面的
futou
2020-11-18 14:31:30 +08:00
@wzw 你发的原图是调色板图像,也许这是你处理结果不好的原因?我试了试 matlab 的 imresize,不放大看的话,默认参数缩放结果就非常清晰,你也可以试试 scipy 里的 imresize,结果也不差。
ipwx
2020-11-18 14:32:49 +08:00
@wzw 如果你是 matplotlib 产生的图,你指定 plt.figure(figsize=) 就可以控制输出图像大小了。最好把两边空白也裁了,我记得是 plt.tight_layout() 还是啥。。。
wzw
2020-11-18 15:22:03 +08:00
@ipwx #27 matplotlib 以后还有一些二次处理的动作, 所以这条不适用, 一定要多次调整大小了
wzw
2020-11-18 15:24:50 +08:00
@futou #26 调色板图像? 我目前用的是 matplotlib fig.savefig 直接保存的
ipwx
2020-11-18 15:41:30 +08:00
@wzw 把 pdf 输出到临时目录,然后用其他工具转换成 png 。
JCZ2MkKb5S8ZX9pq
2020-11-18 15:46:24 +08:00
其实上面说的几种缩图算法应该是对的,缩出来的线条断点就是取样的问题。

img.thumbnail((long_edge_limit, long_edge_limit), Image.ANTIALIAS)

直接拿这句试了试,导出为 png 。
thumbnail 是限制长边,自动缩。长边 800 。



提供几个思路哦
原图如果不是 rgb,而是类似 gif 的 256 色 pattern,会导致颜色不足从而掉色,要先转模式。
缩图之后直接 show 一下看看。
然后再存盘,看看会不会是导出格式的问题。
jdhao
2020-11-18 15:51:37 +08:00
@JCZ2MkKb5S8ZX9pq 有道理,楼主原图是 RGBA 格式的 PNG 图片,并且是 palette 图像,我试了一下 PIL 读取图像,然后再转 RGBA 格式 ( palette 图像转 RGBA ),然后再 resize 和 save,图像质量高了很多。
JCZ2MkKb5S8ZX9pq
2020-11-18 16:03:05 +08:00
@jdhao

一种可能是导入后格式被修改过了,还有一种可能是代码出了问题。因为他出错的图明显是 nearest 采样的,刚看了下文档,版本问题好像会影响默认值。

If omitted, it defaults to PIL.Image.ANTIALIAS. (was PIL.Image.NEAREST prior to version 2.5.0)

但是考虑到 lz 试了好几种,所以感觉可能是参数没起效果(但回退到了 nearest )。
也就是说如果 lz 的 PIL 是 2.5 以下的,可能是参数没加对。如果是新版本,那可能是图本身的问题。可以考虑在格式转换前后都打印一下颜色模式,或者 png 输出的话,强制加一步模式转换试试看。

img = img.convert('RGBA')
JCZ2MkKb5S8ZX9pq
2020-11-18 16:06:46 +08:00
上面是 thumbnail 的,resize 的写得更清楚。

If omitted, or if the image has mode “1” or “P”, it is set PIL.Image.NEAREST.

那就是去查图像 color mode 了。

[Image Module — Pillow (PIL Fork) 2.6.1 documentation]( https://pillow.readthedocs.io/en/3.0.0/reference/Image.html)
jdhao
2020-11-18 16:13:55 +08:00
@JCZ2MkKb5S8ZX9pq 嗯,那就解释了为啥设置其他 filter 没效果了,因为是楼主的原图片是 mode 是 P,所以强制使用 PIL.Image.NEAREST 来采样的。

你看的仔细,我看到这个时候没意识到是因为图像模式问题,赞👍
JCZ2MkKb5S8ZX9pq
2020-11-18 18:16:32 +08:00
@jdhao 美工出身,对这个比较敏感。
wzw
2020-11-19 07:19:06 +08:00
@also24 #19 你是直接用 pillow 吗?
@JCZ2MkKb5S8ZX9pq #33 厉害,不愧是美工出生,我今天试试 img = img.convert('RGBA')

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

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

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

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

© 2021 V2EX