我有一个由从另一个程序收到的子图像组成的大图像,我最终需要使用子图像作为按钮上的图标。 我理解访问 QImage 的位+字节的数学,它在下面的 C++ 问题中有清楚的描述。 我不明白的是如何使用 PySide2 获取偏移位/内存位置。
这是上述 C++ 到 Python 的简单转换:
def myCreateSubImage(largeImage, subRect):
nOffset = subRect.x() * largeImage.depth() / 8 + subRect.y() * largeImage.bytesPerLine()
return QImage(largeImage.bits() + nOffset, subRect.width(), subRect.height(), largeImage.bytesPerLine(), subRect.format())
但是:
使用“largeImage.bits() + nOffset”给我一个“No”“+””函数用于
尝试将其视为Python内存视图对象(如“(largeImage.bits())[nOffset]”)会给我一个“TypeError:需要类似字节的对象,而不是'NoneType'”
将图像数据强制转换为 QByteArray 不起作用,或者我做得不正确。 尝试使用构造函数(即: QByteArray(largeImage.bits()) )创建它告诉我没有采用内存视图的构造函数。 尝试 QByteArray.fromRawData(largeImage.bits()) 告诉我同样的事情。
Python 是面向对象的而不是面向指针的。所以应该将 MemoryView 对象转换为字符串,然后转换为它的子字符串:
def myCreateSubImage(largeImage, subRect):
nOffset = subRect.x() * largeImage.depth() // 8 + subRect.y() * largeImage.bytesPerLine()
return QImage(largeImage.bits().cast('c')[nOffset:], subRect.width(), subRect.height(), largeImage.bytesPerLine(), largeImage.format())