在PySide2中将QImage分割成子图像

问题描述 投票:0回答:1

我有一个由从另一个程序收到的子图像组成的大图像,我最终需要使用子图像作为按钮上的图标。 我理解访问 QImage 的位+字节的数学,它在下面的 C++ 问题中有清楚的描述。 我不明白的是如何使用 PySide2 获取偏移位/内存位置。

将QImage分割成更小的块

这是上述 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()) 告诉我同样的事情。

pyqt5 pyside2 qimage memoryview
1个回答
0
投票

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())
© www.soinside.com 2019 - 2024. All rights reserved.