问题遇到的现象和发生背景
我自己写了一个QT控件显示图片用的,但是需要输入图片的RGB信息和宽高信息,Mat读取JPG和BMP时都正常显示,但是遇到PNG图片时就异常了,我自定义控件显示出来的图像异常,色彩不匹配,图像有显示宽度不对的“倾斜”现象,我查了很多资料都说Mat读取时后面的参数为-1,读出4个通道后,再通过色彩转换接口输入RGBA2RGB参数,就可以了,然而并没有用,图像显示还是错的,实在没有办法解决
问题相关代码,请勿粘贴截图
Mat img = imread(file_path.toStdString(), IMREAD_UNCHANGED);
m_nCurWidth = img.cols;
m_nCurHeight= img.rows;
if(m_pSelImage)
delete [] m_pSelImage;
m_pSelImage = new quint8[m_nCurHeightm_nCurWidth3];
m_pOutImage = new quint8[m_nCurHeightm_nCurWidth3];
int channel = img.channels();
//Mat img1(Size(img.cols, img.rows), CV_8UC3);
Mat img1(img.rows, img.cols, CV_8UC3, Scalar(0, 0, 0));
Mat img2(Size(img.cols, img.rows), CV_8UC3);
if(channel==4){
//cv::cvtColor(img, img1, COLOR_BGRA2BGR);
//cv::cvtColor(img1, img1, COLOR_BGR2RGB);
for (int j=0; j<m_nCurHeight; j++) {
for (int i=0; i<m_nCurWidth; i++) {
img1.at<Vec3b>(j,i)[0] = img.at<Vec4b>(j,i)[0]*float(img.at<Vec4b>(j,i)[3])/255 + img1.at<Vec3b>(j,i)[0]*float(255 - img.at<Vec4b>(j,i)[3])/255;
img1.at<Vec3b>(j,i)[1] = img.at<Vec4b>(j,i)[1]*float(img.at<Vec4b>(j,i)[3])/255 + img1.at<Vec3b>(j,i)[1]*float(255 - img.at<Vec4b>(j,i)[3])/255;
img1.at<Vec3b>(j,i)[2] = img.at<Vec4b>(j,i)[2]*float(img.at<Vec4b>(j,i)[3])/255 + img1.at<Vec3b>(j,i)[2]*float(255 - img.at<Vec4b>(j,i)[3])/255;
m_pOutImage[3*j*m_nCurWidth + 3*i + 0] = img.at<Vec4b>(j,i)[0];
m_pOutImage[3*j*m_nCurWidth + 3*i + 1] = img.at<Vec4b>(j,i)[1];
m_pOutImage[3*j*m_nCurWidth + 3*i + 2] = img.at<Vec4b>(j,i)[2];
}
}
memcpy(m_pSelImage, img1.data, m_nCurHeight*m_nCurWidth*3);
}
else{
cv::cvtColor(img, img1, COLOR_BGR2RGB);
for (int j=0; j<m_nCurHeight; ++j) {
for (int i=0; i<m_nCurWidth; ++i) {
m_pOutImage[3*j*m_nCurWidth + 3*i + 0] = img.at<Vec3b>(j,i)[0];
m_pOutImage[3*j*m_nCurWidth + 3*i + 1] = img.at<Vec3b>(j,i)[1];
m_pOutImage[3*j*m_nCurWidth + 3*i + 2] = img.at<Vec3b>(j,i)[2];
}
}
memcpy(m_pSelImage, img1.data, m_nCurHeight*m_nCurWidth*3);
}
memcpy(img2.data, m_pOutImage, m_nCurHeight*m_nCurWidth*3);