V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HOMO114514
V2EX  ›  微信

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

  •  
  •   HOMO114514 · 2023-12-18 16:52:33 +08:00 · 1693 次点击
    这是一个创建于 376 天前的主题,其中的信息可能已经有所发展或是发生改变。

    图片查看器。

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

    但是,图片是模糊的

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

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

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

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

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

    3 条回复    2023-12-18 19:38:19 +08:00
    jujusama
        1
    jujusama  
       2023-12-18 16:54:42 +08:00
    不能发送语音
    mazhiyuan
        2
    mazhiyuan  
       2023-12-18 16:57:25 +08:00
    有没有可能他们都没确认
    kuanat
        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 的事情。上面说的这个问题,正常科班出身的话,有一点图形学基础大致就能反应过来问题出在哪里,但是没有接触过就几乎想象不到。

    话说回来,反正大家都是草台班子,又不是不能用……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2791 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 09:42 · PVG 17:42 · LAX 01:42 · JFK 04:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.