当前位置:   article > 正文

关于数字信号处理课程实践“VC++实现图片的读取、显示与存储”_csnd社区

csnd社区

**前言:**本次课程首先讲解了关于信号处理的一些理论知识,之后就是通过VC++实现图片的显示与存储

在CSND社区学习简单使用

第一次尝试

1博主学习到了如下内容:
1.首先在vs2010中创建MFC基于对话框的应用程序
2.在资源视图的Dialog界面创建图片显示窗口和控制按钮,方法是在对话框中添加picture control和Button 等控件。分别修改各个控件的ID和Caption。
3.双击打开按钮,MFC自动添加消息响应函数void CBMP_RSYDlg::OnBnClickedButtonOpen(),并在消息响应函数中添加如下代码:

CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"bmp(*.bmp)|*.bmp||",this);
	if (dlg.DoModal()!=IDOK)
	{
		MessageBox("图片打开失败");
		return;
	}
	m_strSrcBmpPath = dlg.GetPathName();

	CFile file;
	file.Open(m_strSrcBmpPath,CFile::modeRead);
	file.Read(m_pBmpFileHeader,14);

	file.Seek(14,CFile::begin);
	file.Read(m_pBmpInfo, 40+256*4);
	if (m_pBmpInfo->bmiHeader.biBitCount==8)//灰度图像,有调色板
	{
		file.Seek(14+40+256*4,CFile::begin);
	}
	else if (m_pBmpInfo->bmiHeader.biBitCount==24)//彩色图像,无调色板
	{
		file.Seek(14+40,CFile::begin);
	}

	int iWidth = m_pBmpInfo->bmiHeader.biWidth;
	int iHeight = m_pBmpInfo->bmiHeader.biHeight;
	int iImgSize = m_pBmpInfo->bmiHeader.biSizeImage;
	int iXPels = m_pBmpInfo->bmiHeader.biXPelsPerMeter;
	int iYPels = m_pBmpInfo->bmiHeader.biYPelsPerMeter;
	int biClrUsed = m_pBmpInfo->bmiHeader.biClrUsed;
	int biClrImportant = m_pBmpInfo->bmiHeader.biClrImportant;

	file.Read(m_pSrcBuf, m_pBmpInfo->bmiHeader.biSizeImage);
	file.Close();

	Invalidate();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

第一次按照此代码与我本身的软件VS不完全贴合,进行了如下的修改:在“无法打开BPM文件”前添加了_T
在“无法打开BPM文件”前添加了_T
在这里插入图片描述
在“图片打开失败”前添加_T
在这里插入图片描述
在代码前进行声明

但是尽管如此由于代码较复杂,经过多次修改后项目已经被破坏了,虽然代码编译无错误,但是最终图片不能被打开如下所示:
第一次按照

第二次尝试

1、新建项目,将代码重新复制到项目中,控件添加稍微简单了些
2、虽然项目成功了但是还是无法将图片打开
如下所示:
在这里插入图片描述

第三次尝试

这一次换了一个博主 学习,但是链接已丢失,学习和实践过程如下:
1、新建项目重新放置了控件如下:
在这里插入图片描述
2、修改和添加了类
在这里插入图片描述
3、添加程序


```cpp

```cpp

```cpp
class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CYUXDlg 对话框




CYUXDlg::CYUXDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CYUXDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	strFilePath = _T("");
	strFileName = _T("");
}

void CYUXDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_STATIC1, m_picture1);
	DDX_Control(pDX, IDC_STATIC2, m_picture2);
}

BEGIN_MESSAGE_MAP(CYUXDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CYUXDlg::OnBnClickedButton1)
END_MESSAGE_MAP()


// CYUXDlg 消息处理程序

BOOL CYUXDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CYUXDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CYUXDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CYUXDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CYUXDlg::OnBnClickedButton1()
{
	CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*|"), this);
    fileDlg.DoModal();
	strFilePath=fileDlg.GetPathName();		//文件路径
	strFileName = fileDlg.GetFileName();	//文件名
	if (strFilePath == _T(""))
    {
        return;
    }
	CImage image;
    image.Load(strFilePath);
	CRect rectControl;                        //控件矩形对象
	m_picture1.GetClientRect(rectControl);
	CDC *pDc = m_picture1.GetDC();			 //设备上下文对象的类
	rectControl = CRect(rectControl.TopLeft(), CSize((int)rectControl.Width(), (int)rectControl.Height()));
	m_picture1.SetBitmap(NULL);				//清空picture
	image.Draw(pDc->m_hDC, rectControl);    //将图片绘制到Picture控件表示的矩形区域
	image.Destroy();
	m_picture1.ReleaseDC(pDc);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171

4、成功显示图片如下:
在这里插入图片描述

总结

虽然第三次尝试终于成功了,但是在这过程中还是有问题,没有完全按照第二个博主的方法来,破坏了项目多次尝试才成功的,总的来说,要细心,每个步骤都不能省略,学会不断反思和发问,继续进步。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/691663
推荐阅读
相关标签
  

闽ICP备14008679号