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

📄 photoshowview.cpp

📁 VS2005图像处理程序的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// photoshowView.cpp : CphotoshowView 类的实现
//

#include "stdafx.h"
#include "photoshow.h"

#include "photoshowDoc.h"
#include "photoshowView.h"
#include "JpegDecoder.h"
#include "MainFrm.h"
#include "EffectDisplay.h"
#include "HistogramDlg.h"
#include "MyDib.h"
#include "LineTranDlg.h"
#include "LogTranDlg.h"
#include "ThresholdDlg.h"
#include "GrayOperator.h"
#include "MoveTranDlg.h"
#include "MirTranDlg.h"
#include "ZoomDlg.h"
#include "RotateDlg.h"
#include "improve.h"
#include "Filter.h"

#include <iostream>
#include <string>
using namespace std;

#pragma warning ( disable : 4996)

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

typedef struct s_BM_header {
	WORD BMP_id ; // 'B''M'
	DWORD size; // size in bytes of the BMP file
	DWORD zero_res; // 0
	DWORD offbits; // 54
	DWORD biSize; // 0x28
	DWORD Width;  // X
	DWORD Height;  // Y
	WORD  biPlanes; // 1
	WORD  biBitCount ; // 24
	DWORD biCompression; // 0 = BI_RGB
	DWORD biSizeImage; // 0
	DWORD biXPelsPerMeter; // 0xB40
	DWORD biYPelsPerMeter; // 0xB40
	DWORD biClrUsed; //0
	DWORD biClrImportant; //0
} BM_header;

typedef struct s_RGB {
	BYTE B;
	BYTE G;
	BYTE R;
} RGB;


// CphotoshowView

IMPLEMENT_DYNCREATE(CphotoshowView, CView)

BEGIN_MESSAGE_MAP(CphotoshowView, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
	ON_COMMAND(ID_FILE_OPEN, &CphotoshowView::OnFileOpen)
	ON_COMMAND(ID_EFFECT_NONE, &CphotoshowView::OnEffectNone)
	ON_COMMAND(ID_EFFECT_RAND, &CphotoshowView::OnEffectRand)
	ON_COMMAND(ID_EFFECT_SCANDOWN, &CphotoshowView::OnEffectScandown)
	ON_COMMAND(ID_EFFECT_VSCAN, &CphotoshowView::OnEffectVscan)
	ON_COMMAND(ID_EFFECT_MOVERIGHT, &CphotoshowView::OnEffectMoveright)
	ON_COMMAND(ID_EFFECT_HSMVOE, &CphotoshowView::OnEffectHsmvoe)
	ON_COMMAND(ID_EFFECT_VBLIND, &CphotoshowView::OnEffectVblind)
	ON_COMMAND(ID_EFFECT_SBLIND, &CphotoshowView::OnEffectSblind)
	ON_COMMAND(ID_EFFECT_VRASTER, &CphotoshowView::OnEffectVraster)
	ON_COMMAND(ID_EFFECT_HRASTER, &CphotoshowView::OnEffectHraster)
	ON_COMMAND(ID_EFFECT_MOSAIC, &CphotoshowView::OnEffectMosaic)
	ON_COMMAND(ID_EFFECT_RAINDROP, &CphotoshowView::OnEffectRaindrop)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_NONE, &CphotoshowView::OnUpdateEffectNone)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_RAND, &CphotoshowView::OnUpdateEffectRand)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_SCANDOWN, &CphotoshowView::OnUpdateEffectScandown)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_VSCAN, &CphotoshowView::OnUpdateEffectVscan)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_MOVERIGHT, &CphotoshowView::OnUpdateEffectMoveright)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_HSMVOE, &CphotoshowView::OnUpdateEffectHsmvoe)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_VBLIND, &CphotoshowView::OnUpdateEffectVblind)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_SBLIND, &CphotoshowView::OnUpdateEffectSblind)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_VRASTER, &CphotoshowView::OnUpdateEffectVraster)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_HRASTER, &CphotoshowView::OnUpdateEffectHraster)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_MOSAIC, &CphotoshowView::OnUpdateEffectMosaic)
	ON_UPDATE_COMMAND_UI(ID_EFFECT_RAINDROP, &CphotoshowView::OnUpdateEffectRaindrop)
//	ON_WM_MOVE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_ERASEBKGND()
ON_WM_SETCURSOR()
ON_COMMAND(ID_POINT_HISTOGRAM, &CphotoshowView::OnPointHistogram)
ON_COMMAND(ID_POINT_LINETRAN, &CphotoshowView::OnPointLinetran)
ON_COMMAND(ID_FILE_SAVE, &CphotoshowView::OnFileSave)
ON_COMMAND(ID_POINT_LOG, &CphotoshowView::OnPointLog)
ON_COMMAND(ID_POINT_THRESHOLD, &CphotoshowView::OnPointThreshold)
ON_COMMAND(ID_POINT_EQUALIZE, &CphotoshowView::OnPointEqualize)
ON_COMMAND(ID_GEO_MOVE, &CphotoshowView::OnGeoMove)
ON_COMMAND(ID_GEO_MIRROR, &CphotoshowView::OnGeoMirror)
ON_COMMAND(ID_GEO_ZOOM, &CphotoshowView::OnGeoZoom)
ON_COMMAND(ID_GEO_ROTATE, &CphotoshowView::OnGeoRotate)
ON_COMMAND(ID_IMPROVE_SMOOTH, &CphotoshowView::OnImproveSmooth)
ON_COMMAND(ID_IMPROVE_SMOOTHG, &CphotoshowView::OnImproveSmoothg)
ON_COMMAND(ID_IMPROVE_MEDIAN, &CphotoshowView::OnImproveMedian)
ON_COMMAND(ID_IMPROVE_SHARP, &CphotoshowView::OnImproveSharp)
ON_COMMAND(ID_IMPROVE_SOBEL, &CphotoshowView::OnImproveSobel)
ON_COMMAND(ID_FILTER_NEGATIVE, &CphotoshowView::OnFilterNegative)
ON_COMMAND(ID_FILTER_EMBOSS, &CphotoshowView::OnFilterEmboss)
ON_COMMAND(ID_FILTER_BW, &CphotoshowView::OnFilterBw)
ON_COMMAND(ID_FILTER_MOSAIC, &CphotoshowView::OnFilterMosaic)
ON_COMMAND(ID_FILTER_SKETCH, &CphotoshowView::OnFilterSketch)
END_MESSAGE_MAP()

// CphotoshowView 构造/析构

CphotoshowView::CphotoshowView()
{
	// TODO: 在此处添加构造代码
	m_nEffectDisplayType = EDT_RAND;
	m_nPos = -1;
	m_bEffectDraw = false;
	m_pBitmap = NULL;
	m_bHeightOut = false;
	m_bWidhtOut = false;
	m_nXX = 0;
	m_nYY = 0;
	m_nXXMax = 0;
	m_nYYMax = 0;
	m_pImageBuffer = NULL;
	m_pImageTempBuffer = NULL;
	m_nPicWidth = m_nPicHeight = 0;
}

CphotoshowView::~CphotoshowView()
{
	::delete m_pBitmap;
	FreeImageBuffer();
}

BOOL CphotoshowView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	return CView::PreCreateWindow(cs);
}

// CphotoshowView 绘制

void CphotoshowView::OnDraw(CDC* pDC)
{
	CphotoshowDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CRect rect;
	GetClientRect(rect);

	CDC memDC;
	CBitmap MemBitmap;
	// 设备描述表初始化
	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));
	if (m_nPos >= 0)
		ShowPicture(&memDC, *m_pBitmap);

	if (m_bEffectDraw && m_nEffectDisplayType != EDT_NONE)
	{
		int nHeight = rect.Height() - m_nShowPicHeight;
		int nWidth = rect.Width() - m_nShowPicWidth;

		if (nHeight < 0)	
			nHeight = 0;
		if (nWidth < 0)	
			nWidth = 0;

		pDC->FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(255,255,255));
		EffectDisplay::s_nOffsetX = nWidth / 2;
		EffectDisplay::s_nOffsetY = nHeight / 2;
		EffectDisplay::s_nPicWidth = m_nShowPicWidth;
		EffectDisplay::s_nPicHeight = m_nShowPicHeight;
		EffectDisplay::s_nCDCWidth = rect.Width();
		EffectDisplay::s_nCDCHeight = rect.Height();

		EffectDisplayImage(pDC, &memDC);

		m_bEffectDraw = false;
	}
	else
		pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

	MemBitmap.DeleteObject();
	memDC.DeleteDC();
}


// CphotoshowView 打印

BOOL CphotoshowView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CphotoshowView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加额外的打印前进行的初始化过程
}

void CphotoshowView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加打印后进行的清除过程
}


// CphotoshowView 诊断

#ifdef _DEBUG
void CphotoshowView::AssertValid() const
{
	CView::AssertValid();
}

void CphotoshowView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CphotoshowDoc* CphotoshowView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CphotoshowDoc)));
	return (CphotoshowDoc*)m_pDocument;
}
#endif //_DEBUG


// CphotoshowView 消息处理程序

void CphotoshowView::OnFileOpen()
{
	// TODO: 在此添加命令处理程序代码
	CFileDialog dlg(true, NULL, L"", 
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR, 
		L"所有图像文件(*.bmp; *.jpg)|*.bmp; *.jpg|所有文件(*.*)|*.*||");

	if (dlg.DoModal() == IDOK)
	{
		OpenFile(dlg.GetPathName());
		FixOffset();
//		RefreshIndicator();
		Invalidate();
	}
}

void CphotoshowView::OpenFile(const CString& strPath)
{
	FreeImageBuffer();
	m_FilesNameAry.RemoveAll();

	int nIndex = strPath.ReverseFind('\\');
	m_strPath = strPath.Left(nIndex);
	CString strFileName = strPath.Right(strPath.GetLength() - nIndex - 1);

	CMainFrame::GetAllFileNames(m_strPath, m_FilesNameAry);
	m_nPicNum = (int)m_FilesNameAry.GetCount();

	m_nPos = 0;

	while( m_nPos < m_nPicNum && m_FilesNameAry[m_nPos] != strFileName)
		m_nPos++;

	PreDrawImage();
	m_bEffectDraw = true;
	Invalidate();
	CString strPath1 = GetFilePath(m_nPos);
	GetImageBuffer(strPath1);
}

void CphotoshowView::PreDrawImage(void)
{
	Image image(GetFilePath(m_nPos));

	::delete m_pBitmap;

	m_pBitmap = ::new Bitmap(image.GetWidth(), image.GetHeight(), PixelFormat32bppARGB);
	Graphics* graph = Graphics::FromImage(m_pBitmap);

	graph->DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight());
	SAFE_DELETE (graph);
}

void CphotoshowView::EffectDisplayImage(CDC* pDC, CDC* pMemDC)
{
	int nType = m_nEffectDisplayType;

	if (nType == EDT_RAND)
	{
		LARGE_INTEGER seed;
		QueryPerformanceFrequency(&seed);
		QueryPerformanceCounter(&seed);

		//初始化一个以微秒为单位的时间种子
		srand((int)seed.QuadPart);

		nType = rand() % 10;
	}
	switch (nType)
	{
	case EDT_SCANDOWN:
		EffectDisplay::ScanDownDisplay(pDC, pMemDC);
		break;

	case EDT_VSCAN:
		EffectDisplay::VSScanDisplay(pDC, pMemDC);
		break;

	case EDT_MOVERIGHT:
		EffectDisplay::MoveRightDisplay(pDC, pMemDC);
		break;

	case EDT_HSMOVE:
		EffectDisplay::HSMoveDisplay(pDC, pMemDC);
		break;

	case EDT_VBLIND:
		EffectDisplay::VBlindDisplay(pDC, pMemDC);
		break;

	case EDT_HBLIND:
		EffectDisplay::HBlindDisplay(pDC, pMemDC);
		break;

	case EDT_VRASTER:
		EffectDisplay::VRasterDisplay(pDC, pMemDC);
		break;

	case EDT_HRASTER:
		EffectDisplay::HRasterDisplay(pDC, pMemDC);
		break;

	case EDT_MOSAIC:
		EffectDisplay::MosaicDisplay(pDC, pMemDC);
		break;

	default:
		EffectDisplay::RaindropDisplay(pDC, pMemDC);
	}
}

void CphotoshowView::ShowPicture(CDC* pDC, Image& image)
{
	Graphics graph(pDC->GetSafeHdc());

	CRect winRect;
	GetClientRect(winRect);

	REAL x = 0.0;
	REAL y = 0.0;
	CSize showPicSize = GetShowPicSize(image);
	REAL width  = (REAL)showPicSize.cx;
	REAL height = (REAL)showPicSize.cy;

	// 使图像居中
	if ((UINT)winRect.Width() > width)
		x = (winRect.Width() - width) / 2.0f;

	if ( (UINT)winRect.Height() > height )
		y = ((UINT)winRect.Height() - height) / 2.0f;

	if (m_bWidhtOut)
		x += m_nXX;

	if (m_bHeightOut)
		y += m_nYY;

	m_nShowPicHeight = (int)height;
	m_nShowPicWidth = (int)width;

	graph.DrawImage(&image, x, y, width, height);
}

CSize CphotoshowView::GetShowPicSize(Image& image)
{
	REAL width  = (REAL)image.GetWidth();
	REAL height = (REAL)image.GetHeight();
	REAL c		= 0.0f;

	CRect winRect;
	GetClientRect(winRect);
	return CSize((int)width, (int)height);
}

void CphotoshowView::OnEffectNone()
{
	m_nEffectDisplayType = EDT_NONE;
}

void CphotoshowView::OnEffectRand()
{
	m_nEffectDisplayType = EDT_RAND;
}

void CphotoshowView::OnEffectScandown()
{
	m_nEffectDisplayType = EDT_SCANDOWN;
}

void CphotoshowView::OnEffectVscan()
{
	m_nEffectDisplayType = EDT_VSCAN;
}

void CphotoshowView::OnEffectMoveright()
{
	m_nEffectDisplayType = EDT_MOVERIGHT;
}

void CphotoshowView::OnEffectHsmvoe()
{
	m_nEffectDisplayType = EDT_HSMOVE;
}

void CphotoshowView::OnEffectVblind()
{
	m_nEffectDisplayType = EDT_VBLIND;
}

void CphotoshowView::OnEffectSblind()
{
	m_nEffectDisplayType = EDT_HBLIND;
}

void CphotoshowView::OnEffectVraster()
{
	m_nEffectDisplayType = EDT_VRASTER;
}

void CphotoshowView::OnEffectHraster()
{
	m_nEffectDisplayType = EDT_HRASTER;
}

void CphotoshowView::OnEffectMosaic()
{
	m_nEffectDisplayType = EDT_MOSAIC;
}

void CphotoshowView::OnEffectRaindrop()
{
	m_nEffectDisplayType = EDT_RAINDROP;
}

void CphotoshowView::OnUpdateEffectNone(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_NONE);
}

void CphotoshowView::OnUpdateEffectRand(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_RAND);
}

void CphotoshowView::OnUpdateEffectScandown(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_SCANDOWN);
}

void CphotoshowView::OnUpdateEffectVscan(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_VSCAN);
}

void CphotoshowView::OnUpdateEffectMoveright(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_MOVERIGHT);
}

void CphotoshowView::OnUpdateEffectHsmvoe(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_HSMOVE);
}

void CphotoshowView::OnUpdateEffectVblind(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_VBLIND);
}

void CphotoshowView::OnUpdateEffectSblind(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_HBLIND);
}

void CphotoshowView::OnUpdateEffectVraster(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_VRASTER);
}

void CphotoshowView::OnUpdateEffectHraster(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_HRASTER);
}

void CphotoshowView::OnUpdateEffectMosaic(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_MOSAIC);
}

void CphotoshowView::OnUpdateEffectRaindrop(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nEffectDisplayType == EDT_RAINDROP);
}


void CphotoshowView::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (nFlags & MK_LBUTTON)
	{
		if (m_bWidhtOut)
		{
			m_nXX += point.x - m_psMove.x;
			if (m_nXX < 0 && abs(m_nXX) > m_nXXMax)
				m_nXX = -m_nXXMax;
			if (m_nXX > 0)
				m_nXX = 0;
		}

		if (m_bHeightOut)
		{
			m_nYY += point.y - m_psMove.y;
			if (m_nYY < 0 && abs(m_nYY) > m_nYYMax)
				m_nYY = -m_nYYMax;
			if (m_nYY > 0)
				m_nYY = 0;
		}

		m_psMove = point;

		Invalidate();

⌨️ 快捷键说明

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