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

时间:2018-01-12 01:55:07

标签: dbus vala gdkpixbuf

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

因此创建了服务器端的Variant

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

和客户

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

一切都是一样的,为两者保存图像的调用是

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

这已经过测试,并且已经在三台不同的计算机上验证了这种情况。我将在明天提供一个完整的例子。我只想先把它放在那里,以防万一有人以前碰到过这个。

1 个答案:

答案 0 :(得分:4)

在D-Bus消息中发送像图像这样的大数据blob并不是D-Bus的设计目的 - 它用于控制消息,而不是大数据消息。您将获得糟糕的性能,并且可能会达到较大图像的D-Bus消息大小限制。有关此示例,请参阅Passing a large data structure over dbus

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