【发布时间】: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)
【问题讨论】: