8

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

  • 如果我将其缩放GdkPixbuf.Pixbuf到从size-allocate信号中获得的尺寸,照片会占用所需的物理空间,但它只使用显示器分辨率的一半(假设设备像素与逻辑像素的比率为 2:1)。
  • 如果我将 t 缩放GdkPixbuf.Pixbufget_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)
4

1 回答 1

3

这通常通过从像素数据创建 cairo 表面然后使用gtk_image_set_from_surface(). 我不会说 Python,但在 CI 中这样做:

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()它不会使用逻辑像素而是设备像素,因此永远不会应用缩放。

于 2020-07-04T14:42:41.003 回答