我正在创建小型图形用户界面系统,我想从Python代码中获取原始字节形式的图像,然后使用这些原始字节创建QImage/QIcon.对于C++/Python交互,我使用Boost Python.

在Python代码端,我打印了原始字节: b ' x89 PNG ' r\n\x1a ' n\x00/x00/x00/x00@\x00,x00,x00,x00@\x08,x02,x00,x00,x00,x00%,x0b,xe6,x89,x00,x00,x00,x000 x03sBIT\x08\x08\x08\xdb\xe1O\xe00\x00\x00\x00\x00\tpHys\x00\x0 0.x0e/xc4/x00/x00/x0e/xc4/x01/x95 +\x0e/x1b/x00\x00/x06/xabIDATh/x81/xed/x9aOh/x13O/x14/xc7wv/x93/xdd/xfcQ1/xa9/x8d.

我将它们作为字符串从Python发送到C++代码,就像:

data.rawBytes = str(thumbnail._raw_bytes)

在C++端,我以字符串的形式提取这些字节:

std::string rawBytes = boost::python::extract<std::string>(obj.attr("rawBytes"));

上面在C++端收到的rawstival与上面的Python打印相同.

现在在UI代码中,我try 使用这些原始字节来创建QIcon,就像:

std::string rawbytes = data.rawBytes;
QByteArray arr();
arr.append(rawbytes.c_str(), rawbytes.length());
bool flag = pixmap.loadFromData(arr, "PNG");

QStandardItem* item = new QStandardItem(name);
item->setIcon(QIcon(pixmap));

图标不会显示在UI中,此外,从pixmap.loadFromData返回的"标志"为假,这意味着原始字节的转换存在一些问题.有人能指出是否需要进行某种从Python到c++代码的转换才能在UI上正确呈现此图像吗?

推荐答案

假设在Python方面您拥有

data.rawBytes = thumbnail._raw_bytes

如果没有str包装器和引用data的C++变量obj,您可以像这样使用Python Buffer协议:

Py_Buffer view = {0};
int ret = PyObject_GetBuffer(obj.attr("rawBytes").ptr(), &view, PyBUF_SIMPLE);
if (ret == -1) {
  // handle error
}

QByteArray arr =
  QByteArray::fromRawData(reinterpret_cast<const char *>(view.buf), view.len);
bool flag = pixmap.loadFromData(arr, "PNG");

PyObject_ReleaseBuffer(&view);

当然,您可以跳过复制到QByteArray并直接从Python缓冲区读取:

pixmap.loadFromData(reinterpret_cast<uchar *>(view.buf), view.len, "PNG"));

Python相关问答推荐

是否有使用纯霍夫曼编码的现代图像格式?

pandas MultiIndex是SQL复合索引的对应物吗?

在pandas DataFrame上运行apply()时如何访问DateTime索引?

Python如何让代码在一个程序中工作而不在其他程序中工作

使用Python和PRNG(不是梅森龙卷风)有效地生成伪随机浮点数在[0,1)中均匀?

具有2D功能的Python十六进制图

使用Ubuntu、Python和Weasyprint的Docker文件-venv的问题

如何在Python中使用时区夏令时获取任何给定本地时间的纪元值?

点到面的Y距离

如何检测背景有噪的图像中的正方形

Pytest两个具有无限循环和await命令的Deliverc函数

2D空间中的反旋算法

根据二元组列表在pandas中创建新列

数据抓取失败:寻求帮助

如何从.cgi网站刮一张表到rame?

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

在Python中动态计算范围

如何在Python中找到线性依赖mod 2

无法连接到Keycloat服务器

python panda ExcelWriter切换动态公式到数组公式