⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logtrandlg.cpp

📁 VS2005图像处理程序的源代码
💻 CPP
字号:
// LogTranDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "photoshow.h"
#include "LogTranDlg.h"
#include "MainFrm.h"
#include "photoshowDoc.h"
#include "photoshowView.h"
#include "GrayOperator.h"
#include <cmath>

// CLogTranDlg 对话框

IMPLEMENT_DYNAMIC(CLogTranDlg, CDialog)

CLogTranDlg::CLogTranDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CLogTranDlg::IDD, pParent)
	, m_nPosA(0)
	, m_nPosB(0)
	, m_nA(0)
	, m_nB(0)
{
	m_bModify = false;
}

CLogTranDlg::~CLogTranDlg()
{
	SAFE_DELETE (dlg);
}

void CLogTranDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_PREV, m_stiPrev);
	DDX_Slider(pDX, IDC_SLIDERA, m_nPosA);
	DDX_Slider(pDX, IDC_SLIDERB, m_nPosB);
	DDX_Text(pDX, IDC_EDITA, m_nA);
	DDX_Text(pDX, IDC_EDITB, m_nB);
}


BEGIN_MESSAGE_MAP(CLogTranDlg, CDialog)
	ON_EN_CHANGE(IDC_EDITA, &CLogTranDlg::OnEnChangeEdita)
	ON_EN_CHANGE(IDC_EDITB, &CLogTranDlg::OnEnChangeEditb)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_SAVE, &CLogTranDlg::OnBnClickedSave)
	ON_WM_HSCROLL()
	ON_BN_CLICKED(IDCANCEL, &CLogTranDlg::OnBnClickedCancel)
END_MESSAGE_MAP()


// CLogTranDlg 消息处理程序

void CLogTranDlg::Refresh(void)
{
	UpdateData(TRUE);

	// 更新预览对话框
	CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
	CphotoshowView* pView = (CphotoshowView*)pMain->GetActiveView();

	LogTrans(pView->m_pImageBuffer, pView->m_pImageTempBuffer, 
			 pView->m_nPicWidth, pView->m_nPicHeight, m_nA, m_nB * 0.001);

	dlg->Refresh();
	CDC*	pDC = m_stiPrev.GetDC();
	CRect	rect;
	CDC		memDC;
	CBitmap MemBitmap;

	// 获取绘图区域
	m_stiPrev.GetClientRect(rect);

	// 设备描述表初始化
	memDC.CreateCompatibleDC(NULL);

	// 建立与屏幕显示兼容的内存显示设备
	MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

	// 选取空白位图
	memDC.SelectObject(MemBitmap);
	memDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(255,255,255));
	Graphics graph(memDC.GetSafeHdc());

	// 使用白色背景
	graph.FillRectangles(&SolidBrush(Color::White), 
		&Rect(0, 0, rect.Width(), rect.Height()), 
		1);

	// 绘制y轴
	graph.DrawLine(&Pen(Color::Black), 10, 10, 10, 280);
	graph.DrawLine(&Pen(Color::Black), 10, 10, 5, 15);
	graph.DrawLine(&Pen(Color::Black), 10, 10, 15, 15);

	// 绘制x轴
	graph.DrawLine(&Pen(Color::Black), 10, 280, 290, 280);
	graph.DrawLine(&Pen(Color::Black), 290, 280, 285, 285);
	graph.DrawLine(&Pen(Color::Black), 290, 280, 285, 275);

	// 绘制坐标原点
	CString strNum;
	Font font(L"宋体", 10);
	strNum = L"0";
	graph.DrawString(strNum, -1, &font, 
		PointF(8, 290), &SolidBrush(Color::Black));
	for (int i = 0; i < 256; i += 5)
	{
		if (i % 50 == 0)
			graph.DrawLine(&Pen(Color::Black), 10 + i, 280, 10 + i, 286);
		else if (i % 10 == 0)
			graph.DrawLine(&Pen(Color::Black), 10 + i, 280, 10 + i, 283);
	}

	// 绘制x轴刻度
	strNum = L"50";
	graph.DrawString(strNum, -1, &font, 
		PointF(53, 290), &SolidBrush(Color::Black));
	strNum = L"100";
	graph.DrawString(strNum, -1, &font, 
		PointF(100, 290), &SolidBrush(Color::Black));
	strNum = L"150";
	graph.DrawString(strNum, -1, &font, 
		PointF(150, 290), &SolidBrush(Color::Black));
	strNum = L"200";
	graph.DrawString(strNum, -1, &font, 
		PointF(200, 290), &SolidBrush(Color::Black));
	strNum = L"255";
	graph.DrawString(strNum, -1, &font, 
		PointF(255, 290), &SolidBrush(Color::Black));
	// y轴
	graph.DrawString(strNum, -1, &font, 
		PointF(10, 25), &SolidBrush(Color::Black));
	// 转换坐标,将(10, 280)转换为坐标原点
	Matrix matrix1;
	Matrix matrix2(0, 1, 1, 0, 0, 0);	// 转置矩阵

	matrix1.Translate(10, 280);
	matrix1.Rotate(270);
	matrix1.Multiply(&matrix2);
	graph.SetTransform(&matrix1);
	// 根据映射表绘制曲线
	// 映射表,用于256种灰度变换后的值
	double map[256];

	// 计算当前像素变换后的值
	for (int i = 0; i < 256; i++)
		map[i] = log((double)i + 1.0) / (double)(m_nB*0.001) + m_nA;


	GraphicsPath path;

	path.StartFigure();
	for (int i = 0; i < 255; i++)
		path.AddLine(i, (int)map[i], i+1, (int)map[i+1]);

	graph.DrawPath(&Pen(Color::Black), &path);

	// 拷贝内存画布内容
	pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

	m_stiPrev.ReleaseDC(pDC);
}

BOOL CLogTranDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	dlg = new CPreviewDlg(this);

	dlg->m_nType = 1;
	dlg->m_bEnableClose = false;
	dlg->Create(IDD_PREVIEW);
	dlg->ShowWindow(SW_SHOW);

	m_nA =m_nPosA= 0;
	m_nPosA = 50;
	m_nB = m_nPosB = 25;
	UpdateData(FALSE);

	((CSliderCtrl*)GetDlgItem(IDC_SLIDERA))->SetRange(-100, 100);

	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void CLogTranDlg::OnEnChangeEdita()
{
	UpdateData(TRUE);

	if (m_nA < -100)
		m_nA = 100;
	else if (m_nA > 100)
		m_nA = 100;

	m_nPosA = m_nA;
	UpdateData(FALSE);
	Refresh();
	m_bModify = true;
}

void CLogTranDlg::OnEnChangeEditb()
{
	UpdateData(TRUE);

	if (m_nB < 0)
		m_nB = 0;
	else if (m_nB > 100)
		m_nB = 100;

	m_nPosB = m_nB;
	UpdateData(FALSE);
	Refresh();
	m_bModify = true;
}

void CLogTranDlg::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	Refresh();
}

void CLogTranDlg::OnBnClickedSave()
{
	CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
	CphotoshowView* pView = (CphotoshowView*)pMain->GetActiveView();

	pView->OnFileSave();
	m_bModify = false;
}


void CLogTranDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	UpdateData(TRUE);

	if (pScrollBar == GetDlgItem(IDC_SLIDERA))
		m_nA = m_nPosA;
	else
		m_nB = m_nPosB;

	UpdateData(FALSE);
	Refresh();
	m_bModify = true;

	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CLogTranDlg::OnBnClickedCancel()
{
	if (m_bModify)
	{
		if (IDYES == MessageBox(L"图像已经更改,是否保存?", L"photoshow", MB_YESNO))
			OnBnClickedSave();
	}
	OnCancel();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -