gpt4 book ai didi

gtk3 - HiDPI 显示器上的 Gtk.Image

转载 作者:行者123 更新时间:2023-12-02 11:18:49 25 4
gpt4 key购买 nike

我用的是 Gtk.ImageGdkPixbuf.Pixbuf 支持显示照片。我缩放照片以适应可用空间以响应 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)

    最佳答案

    这通常是通过从像素数据创建 cairo 表面然后使用 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()它不会使用逻辑像素,而是使用设备像素,因此不会应用任何缩放。

    关于gtk3 - HiDPI 显示器上的 Gtk.Image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56531363/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com