【问题标题】:Gtk.Image on HiDPI displaysHiDPI 显示器上的 Gtk.Image
【发布时间】:2020-07-08 03:42:53
【问题描述】:

我使用由GdkPixbuf.Pixbuf 支持的Gtk.Image 来显示照片。我缩放照片以适应可用空间以响应父小部件的size-allocate 信号。问题是在 HiDPI 显示器上,每个维度都是逻辑像素而不是设备像素,因此会发生以下情况:

  • 如果我将GdkPixbuf.Pixbuf 缩放到我从size-allocate 信号得到的尺寸,照片会占用所需的物理空间,但它只使用显示器分辨率的一半(假设设备像素为 2:1逻辑像素比)。
  • 如果我将GdkPixbuf.Pixbuf 缩放到get_scale_factor() 乘以我从size-allocate 信号得到的尺寸,那么照片将占用两倍的物理空间(即,它不适合窗口)。李>

如何让 GTK 知道我提供给图像的 Pixbuf 对应于设备像素而不是逻辑像素?

更新:这是我尝试过的(这些是简化的示例,我没有任何缩放,只是试图显示未缩放的图像):

尝试 1:

    image = Gtk.Image()
    image.set_from_file("subpixel.png")

尝试 2:

    surface = cairo.ImageSurface.create_from_png("subpixel.png")
    image = Gtk.Image()
    image.set_from_surface(surface)

尝试 3:

    pb = GdkPixbuf.Pixbuf.new_from_file("subpixel.png")
    image = Gtk.Image.new_from_pixbuf(pb)
    self.add(image)

尝试 4:

    pb = GdkPixbuf.Pixbuf.new_from_file("subpixel.png")
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, pb.get_width(), pb.get_height())
    context = cairo.Context(surface)

    Gdk.cairo_set_source_pixbuf(context, pb, 0, 0)
    context.paint()

    image = Gtk.Image()
    image.set_from_surface(surface)

【问题讨论】:

    标签: gtk3 pygtk hidpi


    【解决方案1】:

    这通常通过从像素数据创建一个 cairo 表面然后使用gtk_image_set_from_surface() 来完成。我不会说 Python,但在 C 语言中我会这样做:

    GdkPixbuf *pb = gdk_pixbuf_new_from_file(file, NULL);
    
    if(pb) {
    
        cairo_surface_t *s = gdk_cairo_surface_create_from_pixbuf(pb, 0, gtk_widget_get_window(w));
    
        if(s) {
            gtk_image_set_from_surface(GTK_IMAGE(w), s);
            cairo_surface_destroy(s);       
        }
    
        g_object_unref(pb);
    }
    

    这在这里工作得很好。与gtk_image_set_from_file() 相比,它不使用逻辑像素,而是使用设备像素,因此永远不会应用缩放。

    【讨论】:

    • 哇,没想到一年多后会有答案。 :) 不幸的是,我无法在 Python 中使用这种方法,因为我没有找到与 gdk_cairo_surface_create_from_pixbuf 等效的方法。我尝试了一些类似的事情(添加到我的问题中),但它们都已经应用了缩放。
    • @Zoltan:您可以查看gdk_cairo_surface_create_from_pixbuf 如何设置 cairo 表面并尝试在 Python 中复制它。我上面的代码绝对可以解决问题。我找到了你的问题,因为我和你有同样的问题,只是我使用的是 C 而不是 Python。
    • @Andreas 我非常感谢你,这让我非常抓狂,当我在几周前发现这个问题时,它没有答案。这可以在 HiDPI 显示器上完美修复我的应用程序。
    • 我自己无法尝试这个答案,但我会根据@Scoopta 的评论接受它。
    猜你喜欢
    • 2021-02-18
    • 2013-03-13
    • 2020-02-14
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多