<一>在MFC的picture control中显示JPG格式的图像
1.借助于CxImage图像库,在MFC自带的图像控件中进行JPG图像的显示;配置环境见之前写的博文。
参考博客:
(1)Cxiamge图像库的使用:https://www.cnblogs.com/lidabo/p/6923426.html
(2)http://blog.csdn.net/u012273127/article/details/60462710
(3)http://blog.csdn.net/friendan/article/details/38358507
自己写的代码:
void CToolsV1Dlg::OnBnClickedOpenimagea() ///对按钮添加的事件处理
{
// TODO: 在此添加控件通知处理程序代码
//打开图片选择对话框
LPCTSTR szFilter = _T("BMP(*.bmp)|*.bmp|JPEG(*.jpg)|*.jpg|ALLSUPORTFILE(*.*)|*.*||");
CFileDialog dlgBKFile(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, NULL);
CString strBKFileName;
//如果按下OK键
if (dlgBKFile.DoModal() == IDOK)
{
//读取视频文件
strBKFileName = dlgBKFile.GetPathName();
}
else
{
return;
}
//建立CxImage的类指针
CString strExt; //获取文件后缀名
int imageType; //获取图像类型
strExt = FindExtension(strBKFileName);
imageType = FindType(strExt);
//判断指针是否为空
if (m_pImage1 != NULL)
{
delete m_pImage1;
m_pImage1 = NULL;
}
//开辟内存
m_pImage1 = new CxImage();
//打开图片
m_pImage1->Load(strBKFileName, imageType);
if (!m_pImage1->IsValid())
{
AfxMessageBox(_T("建立图像指针失败!"));
delete m_pImage1;
m_pImage1 = NULL;
return;
}
//绘制图像到相应的图像控件上
m_pWnd1 = this->GetDlgItem(IDC_IMAGEA); //<span style = "white-space:pre"></span>//这里一定要和picture Control控件的ID对应起来
DrawImgOnCtrl(m_pImage1, m_pWnd1);
}
2.编写过程中遇到的问题:
(1)关于构造函数和析构函数,代码理解:
#include <iostream>
using namespace std;
class Line
{
public:
void setLength( double len );
double getLength( void );
Line(); // 这是构造函数声明
~Line(); // 这是析构函数声明
private:
double length;
};
// 成员函数定义,包括构造函数
Line::Line(void)
{
cout << "Object is being created" << endl;
}
Line::~Line(void)
{
cout << "Object is being deleted" << endl;
}
void Line::setLength( double len )
{
length = len;
}
double Line::getLength( void )
{
return length;
}
// 程序的主函数
int main( )
{
Line line;
// 设置长度
line.setLength(6.0);
cout << "Length of line : " << line.getLength() <<endl;
return 0;
}
(2) CxImage类与Mat类之间的转化:
//to Mat
CxImage img;
img.Load("C:\\f.jpg");
uint8_t* buf=NULL;
int32_t len=0;
bool rs =img.Encode(buf,len,CXIMAGE_FORMAT_BMP);
cv::Mat temp2;
vector<uchar> buff2;
buff2.resize(len);
memcpy(&buff2[0],buf,len);
temp2= cv::imdecode(buff2,1);
cv::imshow("111",temp2);
cv::waitKey();
//to Cximage
vector<uchar> buff;
cv::imencode(".bmp" ,temp2,buff);
CxImage img2(&buff[0],buff.size(),CXIMAGE_FORMAT_BMP);
img2.Blt(GetDlgItem(IDC_STATIC_P)->GetDC()->GetSafeHdc());
(3)由于显示部分用到的是Cximage类对图像进行存储,而opencv处理的代码中,是用Mat类对图像进行存储,二者之间通过IplImage类进行转化;
Mat和IplImage之间的转化:
/IplImage—>Mat
//EXAMPLE:
//浅拷贝:
IplImage* pBinary=cvLoadImage("c://temp.jpg",0);
Mat Img;
Img=cvarrToMat(pBinary);
//深拷贝只需要再在Mat里创建一个新的Mat对象,然后进行数据的复制,再用上述的函数进行数据头的复制(浅拷贝):
IplImage* pBinary=cvLoadImage("c://temp.jpg", 0);
Mat ImgTemp;
Img=cvarrToMat(pBinary);
Mat Img = ImgTemp.clone();
//Mat—>IplImage
//EXAMPLE:
//浅拷贝:
Mat Img=imread("1.jpg");
IplImage* pBinary = &IplImage(Img);
//深拷贝只要