的文件
QImage::QImage(uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR)
描述由参数“data”引用的数据必须对齐32位。http://doc.qt.io/qt-5/qimage.html#QImage-3,但至少还不清楚到底是什么意思。我想,每个像素需要32位。但事实并非如此。构建这样的图像是可行的:
uint8_t* rgb = new uint8_t[3 * height * width];
QImage Img(rgb, width, height, QImage::Format_RGB888);但这让人困惑。当我想从图像中获取像素值时,我认为我需要这样做(因为数据是32位对齐的,Qrgb是32位):
QRgb*rawPixelData = (QRgb*) Img.bits();
for(uint32_t i = 0; i < (Img.width * Img.height); ++i)
{
qDebug() << "Red" << qRed(rawPixelData[i]);
qDebug() << "Green" << qGreen(rawPixelData[i]);
qDebug() << "Blue" << qBlue(rawPixelData[i]);
}但这是行不通的(导致崩溃)。所以,我想,数据不是对齐的。那么,数据不是对齐了吗,还是我搞错了?
发布于 2016-12-16 13:06:13
我假定,所谓的“数据”是指所使用的字节数组。对于对齐,它们意味着数组的第一个字节将对齐,因此data % 4将始终为0。并不是每个像素的内部对齐,而是包含像素数据的内存块的对齐。
此外,bits()返回指向无符号字节的指针,而不是指向QRgb的指针。QRgb本质上只是一个整数:
typedef unsigned int QRgb; 我怀疑你会崩溃,因为原始数据是“压缩”的。这意味着,如果您的图像只有RGB而没有alpha,它将只使用每个像素24位或3个字节,因为这将消除25%的内存使用开销。因此,您将从实际数据中走出来,并得到一次崩溃。
您应该尝试以w * h * 3无符号字符的形式迭代它,并为每个下一个像素递增3,并且您的rgb将分别是i, i+1, i+2上的字节。
如果您的图像格式是RGBA,它可能会工作。
实际上,如果您费心检查byteCount,您就会意识到内部使用的字节数是给定格式的最小字节数:
QImage img(100, 100, QImage::Format_RGB888);
qDebug() << img.byteCount(); // 30000 or 3 bytes or 24 bits
QImage img2(100, 100, QImage::Format_RGB555);
qDebug() << img2.byteCount(); // 20000 or 2 bytes or 15 bits
QImage img3(100, 100, QImage::Format_RGBA8888);
qDebug() << img3.byteCount(); // 40000 or 4 bytes or 32 bits发布于 2016-12-16 14:07:22
但至少还不清楚到底是什么意思。
这个表达式是软件工程术语的一部分,与当前的具体情况无关:它与Qt、图像或像素无关。
在支持Qt的平台上,它具有以下严格含义:
uchar *data = ...;
Q_ASSERT(reinterpret_cast<uintptr_t>(data) & 3 == 0);或者,在任意的C++17平台上,它具有以下严格的含义:
size_t size = ...;
uchar *data = ...;
Q_ASSERT(std::align(4, size, reinterpret_cast<void*&>(data), size) ==
reinterpret_cast<void*>(data));https://stackoverflow.com/questions/41184836
复制相似问题