📄 photoshowview.cpp
字号:
// 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 + -