问题:
在解析bmp图片时,使用QImage::bits()拿到第一个像素点的数据,依次访问像素点数据时,发现图像数据错位现象。
原因:
经查询应该为QImage读取bmp图像时,每行的像素点所占内存需为4字节的倍数,所以按照图像的长和宽以及深度,按字节依次读取会出现错位现象。
解决方案:
更改为按行读取,依次获取每行第一个像素点。
示例:
QImage image("test1.bmp");
if (image.format() != QImage::Format_Grayscale16)
{
image.convertTo(QImage::Format_Grayscale16);
}
const char* pImageData = (char*)image.bits();
int nImageWidth = image.width();
int nImageHeight = image.height();
int nBytesPerPixel = image.depth() / 8;
// 按照如下方式读取,当每行像素所占内存非4字节倍数时,发生数据错位
//QByteArray bytesArray(pImageData, nImageWidth * nImageHeight * nBytesPerPixel);
// 更改如下方式读取,轮询获取每行首个像素点
QByteArray bytesArray;
bytesArray.resize(nImageWidth * nImageHeight * nBytesPerPixel);
int index = 0;
for (int y = 0; y < nImageHeight; ++y) {
char* line = reinterpret_cast<char*>(image.scanLine(y));
for (int x = 0; x < nImageWidth * nBytesPerPixel; ++x) {
bytesArray[index] = line[x];
index++;
}
}
const QImage temp((const uchar*)bytesData.data(), nImageWidth, nImageHeight, nImageWidth * nBytesPerPixel, QImage::Format_Grayscale16);
const m_imageThumb = temp.copy();
m_imageThumb .save("output.bmp");
标签:nImageWidth,QT,int,image,nBytesPerPixel,bits,像素点,QImage
From: https://blog.csdn.net/qq_42108961/article/details/144451944