// B2saomiaotuxiangchuangkou.cpp : 实现文件
//
#include "stdafx.h"
#include "Imageprocessing.h"
#include "B2saomiaotuxiangchuangkou.h"
#include "afxdialogex.h"
// B2saomiaotuxiangchuangkou 对话框
IMPLEMENT_DYNAMIC(B2saomiaotuxiangchuangkou, CDialogEx)
B2saomiaotuxiangchuangkou::B2saomiaotuxiangchuangkou(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_B2saomiaotuxiangchuangkou, pParent)
{
//m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
//B2saomiaotuxiangchuangkou::~B2saomiaotuxiangchuangkou()
//{
//}
void B2saomiaotuxiangchuangkou::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_FOLDER_PATH, m_editFolderPath);
DDX_Control(pDX, IDC_LIST_IMAGES, m_listImages);
DDX_Control(pDX, IDC_STATIC_ORIGINAL_IMAGE, m_staticOriginalImage);
DDX_Control(pDX, IDC_STATIC_PROCESSED_IMAGE, m_staticProcessedImage);
DDX_Control(pDX, IDC_COMBO_SAVE_OPTION, m_comboSaveOption);
}
BEGIN_MESSAGE_MAP(B2saomiaotuxiangchuangkou, CDialogEx)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_MOUSEWHEEL()
ON_BN_CLICKED(IDC_BUTTON_SELECT_FOLDER, &B2saomiaotuxiangchuangkou::OnBnClickedButtonSelectFolder)
ON_BN_CLICKED(IDC_BUTTON_START, &B2saomiaotuxiangchuangkou::OnBnClickedButtonStart)
ON_BN_CLICKED(IDC_BUTTON_PAUSE, &B2saomiaotuxiangchuangkou::OnBnClickedButtonPause)
ON_BN_CLICKED(IDC_BUTTON_STOP, &B2saomiaotuxiangchuangkou::OnBnClickedButtonStop)
ON_BN_CLICKED(IDC_BUTTON_RESET, &B2saomiaotuxiangchuangkou::OnBnClickedButtonReset)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_IMAGES, &B2saomiaotuxiangchuangkou::OnLvnItemchangedListImages)
ON_MESSAGE(WM_UPDATE_IMAGE, [](WPARAM wParam, LPARAM lParam) {
B2saomiaotuxiangchuangkou* pThis = (B2saomiaotuxiangchuangkou*)lParam;
pThis->DisplayImage((int)wParam);
return 0;
})
ON_MESSAGE(WM_PROCESSING_DONE, [](WPARAM wParam, LPARAM lParam) {
B2saomiaotuxiangchuangkou* pThis = (B2saomiaotuxiangchuangkou*)lParam;
pThis->ResetProcessing();
return 0;
})
ON_MESSAGE(WM_UPDATE_IMAGE, &B2saomiaotuxiangchuangkou::OnUpdateImage)
ON_MESSAGE(WM_PROCESSING_DONE, &B2saomiaotuxiangchuangkou::OnProcessingDone)
END_MESSAGE_MAP()
BOOL B2saomiaotuxiangchuangkou::OnInitDialog()
{
CDialogEx::OnInitDialog();
/*SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);*/
// 初始化列表控件
m_listImages.InsertColumn(0, _T("图片文件"), LVCFMT_LEFT, 300);
m_listImages.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
// 初始化下拉框
m_comboSaveOption.AddString(_T("覆盖原图"));
m_comboSaveOption.AddString(_T("另存为"));
m_comboSaveOption.SetCurSel(0);
m_comboSaveOption.EnableWindow(FALSE);
// 初始按钮状态
GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(FALSE);
return TRUE;
}
void B2saomiaotuxiangchuangkou::OnBnClickedButtonSelectFolder()
{
CString strFolder;
BROWSEINFO bi = { 0 };
bi.lpszTitle = _T("选择图片文件夹");
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
if (pidl != nullptr) {
TCHAR szPath[MAX_PATH];
if (SHGetPathFromIDList(pidl, szPath)) {
m_strFolderPath = szPath;
m_editFolderPath.SetWindowText(m_strFolderPath);
LoadImageList();
m_comboSaveOption.EnableWindow(TRUE);
UpdateButtonStates();
}
CoTaskMemFree(pidl);
}
}
void B2saomiaotuxiangchuangkou::LoadImageList()
{
m_listImages.DeleteAllItems();
m_imageFiles.RemoveAll();
CFileFind finder;
BOOL bWorking = finder.FindFile(m_strFolderPath + _T("\\*.*"));
int nIndex = 0;
while (bWorking) {
bWorking = finder.FindNextFile();
if (finder.IsDots()) continue;
if (!finder.IsDirectory()) {
CString strFile = finder.GetFileName();
CString strExt = strFile.Right(3);
strExt.MakeLower();
if (strExt == _T("jpg") || strExt == _T("jpeg") ||
strExt == _T("bmp") || strExt == _T("png")) {
m_listImages.InsertItem(nIndex, strFile);
m_imageFiles.Add(finder.GetFilePath());
nIndex++;
}
}
}
finder.Close();
if (m_imageFiles.GetSize() > 0) {
m_nCurrentIndex = 0;
DisplayImage(0);
GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);
}
}
void B2saomiaotuxiangchuangkou::DisplayImage(int nIndex)
{
if (nIndex < 0 || nIndex >= m_imageFiles.GetSize())
return;
m_nCurrentIndex = nIndex;
m_currentImage.Destroy();
if (SUCCEEDED(m_currentImage.Load(m_imageFiles[nIndex]))) {
m_staticOriginalImage.Invalidate();
m_staticProcessedImage.Invalidate();
}
}
void B2saomiaotuxiangchuangkou::DisplayProcessedImage()
{
if (m_processedImage.IsNull())
return;
m_staticProcessedImage.Invalidate();
}
void B2saomiaotuxiangchuangkou::OnPaint()
{
CDialogEx::OnPaint();
if (m_currentImage.IsNull())
return;
// 绘制原图
CDC* pDC = m_staticOriginalImage.GetDC();
CRect rect;
m_staticOriginalImage.GetClientRect(&rect);
pDC->FillSolidRect(rect, RGB(240, 240, 240));
DrawImage(pDC, m_currentImage, rect, m_dZoomOriginal, m_ptZoomCenterOriginal);
m_staticOriginalImage.ReleaseDC(pDC);
// 绘制处理后的图像
if (!m_processedImage.IsNull()) {
pDC = m_staticProcessedImage.GetDC();
m_staticProcessedImage.GetClientRect(&rect);
pDC->FillSolidRect(rect, RGB(240, 240, 240));
DrawImage(pDC, m_processedImage, rect, m_dZoomProcessed, m_ptZoomCenterProcessed);
m_staticProcessedImage.ReleaseDC(pDC);
}
}
void B2saomiaotuxiangchuangkou::DrawImage(CDC* pDC, CImage& image, CRect rect, double dZoom, CPoint ptCenter)
{
int origWidth = image.GetWidth();
int origHeight = image.GetHeight();
// 计算保持比例的显示尺寸
double dAspect = (double)origHeight / (double)origWidth;
int displayWidth = (int)(origWidth * dZoom);
int displayHeight = (int)(origHeight * dZoom * dAspect);
// 计算显示位置(居中)
int x = ptCenter.x - (int)(displayWidth * (double)ptCenter.x / rect.Width());
int y = ptCenter.y - (int)(displayHeight * (double)ptCenter.y / rect.Height());
// 确保图像在控件范围内
if (x < 0) x = 0;
if (y < 0) y = 0;
if (x + displayWidth > rect.Width()) x = rect.Width() - displayWidth;
if (y + displayHeight > rect.Height()) y = rect.Height() - displayHeight;
// 绘制图像
image.StretchBlt(pDC->m_hDC, x, y, displayWidth, displayHeight, SRCCOPY);
}
BOOL B2saomiaotuxiangchuangkou::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// 确定鼠标在哪个控件上
CRect rectOriginal, rectProcessed;
m_staticOriginalImage.GetWindowRect(&rectOriginal);
m_staticProcessedImage.GetWindowRect(&rectProcessed);
if (rectOriginal.PtInRect(pt)) {
// 原图缩放
double dFactor = (zDelta > 0) ? 1.1 : 0.9;
m_dZoomOriginal *= dFactor;
// 限制缩放范围
if (m_dZoomOriginal < 0.1) m_dZoomOriginal = 0.1;
if (m_dZoomOriginal > 5.0) m_dZoomOriginal = 5.0;
// 设置缩放中心点
m_ptZoomCenterOriginal = pt - rectOriginal.TopLeft();
m_staticOriginalImage.Invalidate();
}
else if (rectProcessed.PtInRect(pt)) {
// 处理后图像缩放
double dFactor = (zDelta > 0) ? 1.1 : 0.9;
m_dZoomProcessed *= dFactor;
// 限制缩放范围
if (m_dZoomProcessed < 0.1) m_dZoomProcessed = 0.1;
if (m_dZoomProcessed > 5.0) m_dZoomProcessed = 5.0;
// 设置缩放中心点
m_ptZoomCenterProcessed = pt - rectProcessed.TopLeft();
m_staticProcessedImage.Invalidate();
}
return CDialogEx::OnMouseWheel(nFlags, zDelta, pt);
}
void B2saomiaotuxiangchuangkou::OnLvnItemchangedListImages(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVIS_SELECTED)) {
if (m_bProcessing) {
// 处理过程中:临时显示3秒
m_bUserBrowsing = TRUE;
PostMessage(WM_UPDATE_IMAGE, pNMLV->iItem, (LPARAM)this);
SetTimer(1, 3000, nullptr); // 3秒定时器
}
else {
// 非处理状态:持续显示
DisplayImage(pNMLV->iItem);
}
}
*pResult = 0;
}
void B2saomiaotuxiangchuangkou::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == 1 && m_bUserBrowsing) {
KillTimer(1);
m_bUserBrowsing = FALSE;
DisplayImage(m_nProcessingIndex); // 切回处理中的图片
}
CDialogEx::OnTimer(nIDEvent);
}
void B2saomiaotuxiangchuangkou::OnBnClickedButtonStart()
{
if (m_imageFiles.GetSize() == 0)
return;
m_bProcessing = TRUE;
m_nProcessingIndex = 0;
UpdateButtonStates();
// 启动处理线程
AfxBeginThread([](LPVOID pParam) -> UINT {
B2saomiaotuxiangchuangkou* pThis = (B2saomiaotuxiangchuangkou*)pParam;
while (pThis->m_nProcessingIndex < pThis->m_imageFiles.GetSize()) {
if (pThis->m_bPaused) {
Sleep(100);
continue;
}
// 更新显示
pThis->PostMessage(WM_UPDATE_IMAGE, pThis->m_nProcessingIndex, (LPARAM)pThis);
// 处理当前图像
pThis->ProcessCurrentImage();
pThis->DisplayProcessedImage();
// 保存处理结果
pThis->SaveProcessedImage();
pThis->m_nProcessingIndex++;
Sleep(500); // 模拟处理时间
}
pThis->PostMessage(WM_PROCESSING_DONE, 0, (LPARAM)pThis);
return 0;
}, this);
}
void B2saomiaotuxiangchuangkou::ProcessCurrentImage()
{
if (m_currentImage.IsNull())
return;
// 示例处理:转换为灰度图
m_processedImage.Destroy();
m_processedImage.Create(m_currentImage.GetWidth(),
m_currentImage.GetHeight(),
m_currentImage.GetBPP());
for (int y = 0; y < m_currentImage.GetHeight(); y++) {
for (int x = 0; x < m_currentImage.GetWidth(); x++) {
COLORREF color = m_currentImage.GetPixel(x, y);
BYTE r = GetRValue(color);
BYTE g = GetGValue(color);
BYTE b = GetBValue(color);
BYTE gray = static_cast<BYTE>(0.299 * r + 0.587 * g + 0.114 * b);
m_processedImage.SetPixel(x, y, RGB(gray, gray, gray));
}
}
}
void B2saomiaotuxiangchuangkou::SaveProcessedImage()
{
if (m_processedImage.IsNull())
return;
int nOption = m_comboSaveOption.GetCurSel();
CString strPath;
if (nOption == 0) { // 覆盖原图
strPath = m_imageFiles[m_nProcessingIndex];
}
else { // 另存为
CString strDir = m_strFolderPath + _T("\\Processed");
CreateDirectory(strDir, nullptr);
CString strFile;
m_listImages.GetItemText(m_nProcessingIndex, 0, strFile);
strPath = strDir + _T("\\") + strFile;
}
// 保存图像
HRESULT hr = m_processedImage.Save(strPath);
}
void B2saomiaotuxiangchuangkou::OnBnClickedButtonPause()
{
m_bPaused = !m_bPaused;
CButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON_PAUSE);
pButton->SetWindowText(m_bPaused ? _T("继续") : _T("暂停"));
UpdateButtonStates();
}
void B2saomiaotuxiangchuangkou::OnBnClickedButtonStop()
{
m_bProcessing = FALSE;
m_bPaused = FALSE;
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(TRUE);
}
void B2saomiaotuxiangchuangkou::OnBnClickedButtonReset()
{
m_processedImage.Destroy();
m_staticProcessedImage.Invalidate();
GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(FALSE);
}
void B2saomiaotuxiangchuangkou::ResetProcessing()
{
m_bProcessing = FALSE;
m_bPaused = FALSE;
m_nProcessingIndex = -1;
UpdateButtonStates();
GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(TRUE);
}
void B2saomiaotuxiangchuangkou::UpdateButtonStates()
{
GetDlgItem(IDC_BUTTON_START)->EnableWindow(!m_bProcessing && m_imageFiles.GetSize() > 0);
GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(m_bProcessing);
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(m_bProcessing);
GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(FALSE);
}
LRESULT B2saomiaotuxiangchuangkou::OnUpdateImage(WPARAM wParam, LPARAM lParam)
{
DisplayImage(static_cast<int>(wParam));
return 0;
}
LRESULT B2saomiaotuxiangchuangkou::OnProcessingDone(WPARAM wParam, LPARAM lParam)
{
ResetProcessing();
return 0;
}报严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) 不存在从 "lambda []int (WPARAM wParam, LPARAM lParam)->int" 到 "LRESULT (CWnd::*)(WPARAM, LPARAM)" 的适当转换函数 Imageprocessing c:\Users\Administrator\Desktop\111\Imageprocessing\Imageprocessing\B2saomiaotuxiangchuangkou.cpp 45
错误(活动) 不存在从 "lambda []int (WPARAM wParam, LPARAM lParam)->int" 到 "LRESULT (CWnd::*)(WPARAM, LPARAM)" 的适当转换函数 Imageprocessing c:\Users\Administrator\Desktop\111\Imageprocessing\Imageprocessing\B2saomiaotuxiangchuangkou.cpp 50
错误(活动) 没有与参数列表匹配的 重载函数 "CListCtrl::GetItemText" 实例 Imageprocessing c:\Users\Administrator\Desktop\111\Imageprocessing\Imageprocessing\B2saomiaotuxiangchuangkou.cpp 353
错误 C2440 “static_cast”: 无法从“B2saomiaotuxiangchuangkou::GetThisMessageMap::<lambda_ac786482bcca587bd9cc736ece35bc71>”转换为“LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)” Imageprocessing c:\users\administrator\desktop\111\imageprocessing\imageprocessing\b2saomiaotuxiangchuangkou.cpp 49
错误 C2440 “static_cast”: 无法从“B2saomiaotuxiangchuangkou::GetThisMessageMap::<lambda_a9c7879179f942e6187dc0172c95ae29>”转换为“LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)” Imageprocessing c:\users\administrator\desktop\111\imageprocessing\imageprocessing\b2saomiaotuxiangchuangkou.cpp 54
错误 C2661 “CListCtrl::GetItemText”: 没有重载函数接受 3 个参数 Imageprocessing c:\users\administrator\desktop\111\imageprocessing\imageprocessing\b2saomiaotuxiangchuangkou.cpp 353