图片查看器。
对于比窗口要大的图片,双击或者点击标题栏的 1:1 按钮,会缩放到实际大小
但是,图片是模糊的
你需要手动拖动图片到最左边缘,这时候图片的 x 方向会变得清晰
再继续拖动到最上边缘,这时候 y 方向会变得清晰,正确渲染出像素对应的图像
(截图有点难看出来,各位用手机等高分辨率设备截个屏,用心去感受一下)
合理怀疑,双击放大之后,这个图片查看器的 pixel 采样点并没有实际对齐到左上角,而是在每个 pixel 的中央
天知道这东西他们怎么写的
1
jujusama 2023-12-18 16:54:42 +08:00
不能发送语音
|
2
mazhiyuan 2023-12-18 16:57:25 +08:00
有没有可能他们都没确认
|
3
kuanat 2023-12-18 19:38:19 +08:00 5
做个不负责任的猜测。
我印象 Windows 微信自带的那个图片查看器是单独用 C 写的,底层是 GDI+,内部实现是支持 DPI 缩放的。 这就意味着它不是以物理 pixel 的方式来显示图片的,所以缩放的时候会存在逻辑像素和物理像素的比例转换,由此内部会有 rounding ,如果要正常显示图片其实是需要插值的。 除非图片恰好位于画布的 (0,0) 位置,按 Windows 显示的坐标系就是左上角。这个逻辑在大部分时候会感知不到,因为对于不需要缩放的场景,画布和图片是一样大的,没有插值过程。严格来说还是会走一遍插值流程,但是没有 rounding 。 但是对于需要缩放的场景,图片不会位于 (0,0) 位置,这时候插值的效果就体现出来了。默认的插值逻辑是 Linear 算法,这个很容易察觉到模糊。 这个行为比较反直觉,把图片放到左上角,它就是清晰的。一旦相对画布有个 (x,y) 偏移,即使没有任何缩放,也会导致模糊。 上面都是凭印象写的,要验证的话看一下那个图片查看器的导入函数,如果没有 SetInterpolationMode 的调用基本就是这个问题没跑了。 PS 其实像文本编辑器、图片查看器这类应用都是很难写的,细节非常多而且原理都非常基础,不是简单调用个 API 的事情。上面说的这个问题,正常科班出身的话,有一点图形学基础大致就能反应过来问题出在哪里,但是没有接触过就几乎想象不到。 话说回来,反正大家都是草台班子,又不是不能用…… |