代码之家  ›  专栏  ›  技术社区  ›  geoffjay

从DBus客户机/服务器保存GdkPixbuf会导致不同的文件

  •  1
  • geoffjay  · 技术社区  · 8 年前

    我有一个DBus服务,它为Pixbuf文件创建一个变体类型,当保存在任意一侧时,会给出两个不同的文件,尽管数据是相同的。从服务器端保存的图像是正确的,客户端的图像显示顶部1/3正确,中间1/3水平移动1/3宽度,颜色不稳定,底部1/3移动2/3宽度,颜色不稳定。

    服务器端的变体是这样创建的

    var image_var = new Variant ("(iiibi^ay)",
                                 width,
                                 height,
                                 stride,
                                 has_alpha,
                                 bits_per_sample,
                                 data);
    

    并由客户使用

    Variant data_var = null;
    image.get ("(iiibi@ay)",
               &width,
               &height,
               &stride,
               &has_alpha,
               &bits_per_sample,
               &data_var);
    

    我在两侧打印关于pixbuf的内容,包括校验和。服务器端提供

    Width:         1024
    Height:        768
    Stride:        3072
    Bits/Sample:   8
    Has Alpha:     false
    Data Length:   786432
    Data Checksum: e1facf66095e46d7ca3338b6438c1939
    

    和客户

    宽度:1024
    高度:768
    步幅:3072
    位/样本:8
    具有Alpha:false
    数据长度:786432
    数据校验和:e1facf66095e46d7ca3338b6438c1939
    

    一切都是一样的,为两者保存图像的要求是

    pixbuf.save (filename, "jpeg", "quality", "100", null);
    

    这一点已经在三台不同的计算机上进行了测试,并得到了验证。我将提供一个完整的示例,很可能是明天。我只是想先把它放出来,不带它,以防有人以前碰到过。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Philip Withnall    8 年前

    在D-Bus消息中发送像图像这样的大数据块并不是D-Bus为控制消息而设计的,而不是大数据消息。您的性能会很差,并且可能会达到较大图像的D-Bus消息大小限制。看见 Passing a large data structure over dbus 举个例子。

    相反,您应该向图像数据发送句柄。D-Bus以 file descriptor type (键入字符串 h ),它允许您将图像数据的文件描述符从一个进程传递到另一个进程。例如,文件描述符可以是未命名的管道,也可以是打开的只读文件。