首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gtk.Image on HiDPI显示器

Gtk.Image on HiDPI显示器
EN

Stack Overflow用户
提问于 2019-06-10 18:02:28
回答 1查看 627关注 0票数 8

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

  • 如果将GdkPixbuf.Pixbuf缩放到从size-allocate信号获得的维度,则照片占用所需的物理空间,但它只使用显示器分辨率的一半(假设设备像素与逻辑像素的比值为2:1 )。
  • 如果我将GdkPixbuf.Pixbuf缩放到get_scale_factor()乘以从size-allocate信号得到的维数,那么照片将占用物理空间的两倍(也就是说,它将不适合于窗口)。

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

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

尝试1:

代码语言:javascript
复制
    image = Gtk.Image()
    image.set_from_file("subpixel.png")

企图2:

代码语言:javascript
复制
    surface = cairo.ImageSurface.create_from_png("subpixel.png")
    image = Gtk.Image()
    image.set_from_surface(surface)

企图3:

代码语言:javascript
复制
    pb = GdkPixbuf.Pixbuf.new_from_file("subpixel.png")
    image = Gtk.Image.new_from_pixbuf(pb)
    self.add(image)

企图4:

代码语言:javascript
复制
    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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-04 14:42:41

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

代码语言:javascript
复制
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()不同的是,它不会使用逻辑像素,而是设备像素,因此永远不会应用缩放。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56531363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档