HiDPI显示器上的Gtk.Image

时间:2019-06-10 18:02:28

标签: gtk3 pygtk hidpi

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

  • 如果我将GdkPixbuf.Pixbuf缩放到从size-allocate信号得到的尺寸,则照片将占用所需的物理空间,但它仅使用显示器分辨率的一半(假设2: 1个设备像素与逻辑像素的比率)。
  • 如果我将GdkPixbuf.Pixbuf的尺寸放大size-allocatehttps://stackoverflow.com/questions/*的倍数,则照片将占据两倍的物理空间(即无法容纳窗口)。

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

1 个答案:

答案 0 :(得分:2)

通常是通过根据像素数据创建一个开罗表面,然后使用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()相比,它不使用逻辑像素,而是使用设备像素,因此永远不会应用缩放。