【问题标题】:Saving a GdkPixbuf from a DBus client/server result in different files从 DBus 客户端/服务器保存 GdkPixbuf 会导致不同的文件
【发布时间】:2018-01-12 01:55:06
【问题描述】:

我有一个 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);

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

【问题讨论】:

  • 关键部分将是您如何在客户端加载接收到的数据与在服务器端加载原始图像。注意:由于您只是在总线上传输宽度、高度等信息,因此它们都是无关紧要的。

标签: dbus vala gdkpixbuf


【解决方案1】:

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

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

【讨论】:

  • 我有点想这是它应该如何工作的,但我看到了一个直接使用 Variant 实现的示例,并认为我可能会侥幸成功。经过进一步检查,这是用于媒体通知的微小封面艺术图像,因此传输的数据不多。
  • 是的,这是有道理的。您应该查看数百字节图像数据的硬限制,以使该方法有意义。
猜你喜欢
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多