QImage加载内存中的BMP位图数据,显示的图片和原始图片不一致,是相反的,以下是代码,求各位大神指点
void MainWindow::ReadShowBMP(QString strFile)
{
QFile file(strFile);
if(!file.open(QIODevice::ReadOnly))
{
qDebug()<<"open file failed"<<endl;
}
QDataStream streamIn(&file);
streamIn.setByteOrder(QDataStream::LittleEndian);
BITMAPFILEHEADER imageSrc;
initStruct((char*)&imageSrc, sizeof(BITMAPFILEHEADER));
streamIn >> imageSrc.bfType;
streamIn >> imageSrc.bfSize;
streamIn >> imageSrc.bfReserved1;
streamIn >> imageSrc.bfReserved2;
streamIn >> imageSrc.bfOffBits;
BITMAPINFOHEADER infoSrc;
initStruct((char*)&infoSrc, sizeof(BITMAPINFOHEADER));
streamIn >> infoSrc.biSize;
streamIn >> infoSrc.biWidth;
streamIn >> infoSrc.biHeight;
streamIn >> infoSrc.biPlanes;
streamIn >> infoSrc.biBitCount;
streamIn >> infoSrc.biCompression;
streamIn >> infoSrc.biSizeImage;
streamIn >> infoSrc.biXPelsPerMeter;
streamIn >> infoSrc.biYPelsPerMeter;
streamIn >> infoSrc.biClrUsed;
streamIn >> infoSrc.biClrImportant;
RGBQUAD *pColorTable;
BYTE format = WORDtoQuint16(infoSrc.biBitCount);
if (format == 1) //对于黑白图
{
pColorTable = new RGBQUAD[2];
//读入颜色表
for (int i = 0; i < 2; i++)
{
streamIn >> pColorTable[i].rgbBlue;
streamIn >> pColorTable[i].rgbGreen;
streamIn >> pColorTable[i].rgbRed;
streamIn >> pColorTable[i].rgbReserved;
}
}
if (format == 8) //对于灰度图,共有256种颜色
{
pColorTable = new RGBQUAD[256];
//读入颜色表
for (int i = 0; i < 256; i++)
{
streamIn >> pColorTable[i].rgbBlue;
streamIn >> pColorTable[i].rgbGreen;
streamIn >> pColorTable[i].rgbRed;
streamIn >> pColorTable[i].rgbReserved;
}
}
quint32 length;
length = DWORDtoQuint32(imageSrc.bfSize) - DWORDtoQuint32(imageSrc.bfOffBits);
BYTE * bmpData = new BYTE[length];
for (quint32 i = 0; i < length; i++)
{
streamIn >> bmpData[i];
}
QImage image(bmpData,57,68,QImage::Format_RGB888);
QMatrix matrix;
matrix.rotate(180);
QImage imgRatate = image.transformed(matrix).rgbSwapped();
QPixmap pixmap = QPixmap::fromImage(imgRatate);
ui->label->setPixmap(pixmap);
file.close();
下图是显示对比,左边是通过paintEvent显示的原始图片,右边是QImage显示的图片
|