sách gpt4 ai đã đi

gtk3 - HiDPI 显示器上的 Gtk.Image

In lại 作者:行者123 更新时间:2023-12-02 11:18:49 25 4
mua khóa gpt4 Nike

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

  • 如果我缩放 GdkPixbuf.Pixbuf到我从 size-allocate 得到的尺寸信号,照片占据了所需的物理空间,但它只使用了显示器分辨率的一半(假设设备像素与逻辑像素比为 2:1)。
  • 如果我缩放 GdkPixbuf.PixbufĐẾN get_scale_factor() 乘以我从 size-allocate 得到的尺寸信号,则照片将占用两倍的物理空间(即,它无法放入窗口中)。

  • 我如何让 GTK 知道 Pixbuf我提供的图像对应于设备像素而不是逻辑像素?
    更新:这是我尝试过的(这些是我没有任何缩放的简化示例,只是尝试显示未缩放的图像):
    Lần thử thứ 1:
        image = Gtk.Image()
    image.set_from_file("subpixel.png")
    Lần thử thứ 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)

    1 Câu trả lời

    这通常是通过从像素数据创建 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
    行者123
    Hồ sơ cá nhân

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá Didi Taxi miễn phí
    Mã giảm giá Didi Taxi
    Giấy chứng nhận ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com