解决QLabel显示图片扭曲的问题

最近在做图像检索的界面时,发现读取的大部分图片Mat格式用QLabel显示时出现扭曲,原来的彩色图扭曲成了灰度图,而在之前一直使用的是QLabel显示并未出现这样的问题,仔细观察出现此类问题的情况,发现在显示不规则图片时就会出现显示扭曲。如下图

解决QLabel显示图片扭曲的问题_第1张图片

图1 正常(352x288)

解决QLabel显示图片扭曲的问题_第2张图片

图2 扭曲(尺寸133*184)

个人猜想应该是图片数据不对齐导致的,百度之后果然是因为图片数据没有按照4字节对齐导致的。大多数的教程都是修改Mat格式,进行数据填充从而转换为QPixmap显示后就可以啦。然而对于Qt这么强大的一个工具居然解决不了这样的小问题感觉不合理,再百度发现QImage的构造函数已经由解决方案了。

	QImage(uchar * data, int width, int height, int bytesPerLine, Format format, QImageCleanupFunction cleanupFunction = 0, void * cleanupInfo = 0)
data直接使用Mat类型的data即可,width表示图像的宽,height表示高,bytesPerline表示每行拥有的字节数(如果没有该参数则默认按照4字节对齐的方式显示,见另个构造函数),format表示图片格式,彩色图一般采用Format_RGB888,灰度图则使用Format_indexed8。

得到这个后将原来的转换函数:

QPixmap ImageSearch::Mat2Pixmap(Mat &srcImg)
{
    QImage qsrcImg = QImage(srcImg.data,srcImg.cols,srcImg.rows,QImage::Format_RGB888);
    QPixmap srcPixmap = QPixmap::fromImage(qsrcImg);
    return srcPixmap;
}
转换成:

QPixmap ImageSearch::Mat2Pixmap(Mat &srcImg)
{
    QImage qsrcImg = QImage(srcImg.data,srcImg.cols,srcImg.rows,srcImg.cols*srcImg.channels(),QImage::Format_RGB888);
    QPixmap srcPixmap = QPixmap::fromImage(qsrcImg);
    return srcPixmap;
}
修改后显示正常,问题解决!

如图:

解决QLabel显示图片扭曲的问题_第3张图片




你可能感兴趣的:(Qt学习)