我使用一个由
第二次尝试:
第四次尝试:
GdkPixbuf.Pixbuf
支持的 Gtk.Image
来显示照片。我根据父部件的 size-allocate
信号来缩放照片以适应可用空间。问题是,在 HiDPI 显示器上,每个维度都是逻辑像素而不是设备像素,因此会出现以下一种情况:
- 如果我将
GdkPixbuf.Pixbuf
缩放到从size-allocate
信号中获得的尺寸,照片将占据所需的物理空间,但它只使用了显示器分辨率的一半(假设为2:1的设备像素比逻辑像素)。 - 如果我将
GdkPixbuf.Pixbuf
缩放到get_scale_factor()
倍于从size-allocate
信号中获得的尺寸,则照片将占用两倍的物理空间(即,它将无法适应窗口)。
如何让GTK知道我提供给Image的 Pixbuf
对应于设备像素而不是逻辑像素?
更新:这是我尝试过的(这些都是简单的示例,没有进行任何缩放,只是尝试显示未缩放的图像):
尝试1:
image = Gtk.Image()
image.set_from_file("subpixel.png")
第二次尝试:
surface = cairo.ImageSurface.create_from_png("subpixel.png")
image = Gtk.Image()
image.set_from_surface(surface)
第三次尝试:
pb = GdkPixbuf.Pixbuf.new_from_file("subpixel.png")
image = Gtk.Image.new_from_pixbuf(pb)
self.add(image)
第四次尝试:
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)
gdk_cairo_surface_create_from_pixbuf
如何设置cairo表面,并尝试在Python中复制它。我上面的代码绝对可以解决问题。我发现你的问题是因为我和你有同样的问题,只是我使用的是C而不是Python。 - Andreas