说一个微信 for Windows 平常很难注意到但是对于写轮眼玩家很恼火的 bug

144 天前
 chowdpa02k413

图片查看器。

对于比窗口要大的图片,双击或者点击标题栏的 1:1 按钮,会缩放到实际大小

但是,图片是模糊的

你需要手动拖动图片到最左边缘,这时候图片的 x 方向会变得清晰

再继续拖动到最上边缘,这时候 y 方向会变得清晰,正确渲染出像素对应的图像

(截图有点难看出来,各位用手机等高分辨率设备截个屏,用心去感受一下)

合理怀疑,双击放大之后,这个图片查看器的 pixel 采样点并没有实际对齐到左上角,而是在每个 pixel 的中央

天知道这东西他们怎么写的

1478 次点击
所在节点    微信
3 条回复
jujusama
144 天前
不能发送语音
mazhiyuan
144 天前
有没有可能他们都没确认
kuanat
144 天前
做个不负责任的猜测。

我印象 Windows 微信自带的那个图片查看器是单独用 C 写的,底层是 GDI+,内部实现是支持 DPI 缩放的。

这就意味着它不是以物理 pixel 的方式来显示图片的,所以缩放的时候会存在逻辑像素和物理像素的比例转换,由此内部会有 rounding ,如果要正常显示图片其实是需要插值的。

除非图片恰好位于画布的 (0,0) 位置,按 Windows 显示的坐标系就是左上角。这个逻辑在大部分时候会感知不到,因为对于不需要缩放的场景,画布和图片是一样大的,没有插值过程。严格来说还是会走一遍插值流程,但是没有 rounding 。

但是对于需要缩放的场景,图片不会位于 (0,0) 位置,这时候插值的效果就体现出来了。默认的插值逻辑是 Linear 算法,这个很容易察觉到模糊。

这个行为比较反直觉,把图片放到左上角,它就是清晰的。一旦相对画布有个 (x,y) 偏移,即使没有任何缩放,也会导致模糊。

上面都是凭印象写的,要验证的话看一下那个图片查看器的导入函数,如果没有 SetInterpolationMode 的调用基本就是这个问题没跑了。


PS

其实像文本编辑器、图片查看器这类应用都是很难写的,细节非常多而且原理都非常基础,不是简单调用个 API 的事情。上面说的这个问题,正常科班出身的话,有一点图形学基础大致就能反应过来问题出在哪里,但是没有接触过就几乎想象不到。

话说回来,反正大家都是草台班子,又不是不能用……

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

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

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

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

© 2021 V2EX