QImage和Mat想换转换中透明部分的处理(PNG)

来源:互联网 发布:群发短信软件哪个好 编辑:程序博客网 时间:2024/05/21 17:10

网上有很多QImage和Mat的相互转换的代码

如:

http://blog.sina.com.cn/s/blog_7559ce850100ydvy.html

http://hi.baidu.com/windroc/item/5c4b4a13725c11433a176eca

但这些代码都存在一个问题

就是处理png图片时,透明部分显示为黑色

经过认真自己的研究和修改尝试

终于搞定


1、QImage to Mat

cv::Mat qimage2mat(const QImage& qimage){cv::Mat mat = cv::Mat(qimage.height(), qimage.width(), CV_8UC4, (uchar*)qimage.bits(), qimage.bytesPerLine()); cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC4 ); int from_to[] = { 0,0, 1,1, 2,2 ,3, 3 }; cv::mixChannels( &mat, 1, &mat2, 1, from_to, 4 ); return mat2; }

2、Mat to QImage

template<typename T>inline QImage const reference_mat_to_qimage(cv::Mat &mat, QImage::Format format){return QImage((T*)(mat.data), mat.cols, mat.rows, mat.step, format);}  QImage const copy_mat_to_qimage(cv::Mat const &mat, QImage::Format format){QImage image(mat.cols, mat.rows, format);for (int i = 0; i != mat.rows; ++i){memcpy(image.scanLine(i), mat.ptr(i), image.bytesPerLine() );}return image;}  QImage const mat_to_qimage_cpy(cv::Mat &mat, int qimage_format){if(mat.type() == CV_8UC3){        cv::cvtColor(mat, mat, CV_BGR2RGB);return copy_mat_to_qimage(mat, QImage::Format_RGB888);}if(mat.type() == CV_8U){return copy_mat_to_qimage(mat, QImage::Format_Indexed8);}if(mat.type() == CV_8UC4){        if(qimage_format == -1){return copy_mat_to_qimage(mat, QImage::Format_ARGB32);}else{return copy_mat_to_qimage(mat, QImage::Format(qimage_format));}}return QImage();}

调用实例:

 cv::Mat mat = qimage2mat(pImage);  cv::flip(mat,mat,0); QImage imgShow = mat_to_qimage_cpy(mat,QImage::Format_ARGB32_Premultiplied);


0 0
原创粉丝点击