为部门写的处理照片的小程序
不只不觉已经大三下了,虽然博客之前一直没更新,但是也写了一些东西。现在挑一些发上来。
这篇写的是自己刚开始学编程没多久写的一个程序。现在看起来确实没什么技术含量。但是在当时自己还因这个程序很高兴,因为这是我写的第一个实用性的程序。
大一大二的时候我在学生会新闻部任职。当时的主要任务就是出席学院里的活动,拍照、记录,回来整理照片写稿发稿。稿子的照片规定必须是横排,水平像素必须是500。我加入部门时部长给的方法就是用画图板打开照片,更改像素。方法费时费力。我当时还想作为信息工程学院的学生会在计算机上还用这种低级的手段。
后来我编程入门以后就想改变这个问题。我还记得当时熬了两天夜,熬到晚上一两点,终于把这个程序写出来了。虽然现在回过头看代码挺低级的,但在当时水平很低的时候能做出这个已经挺兴奋了。
这个程序界面和操作很简单。把你想要处理的照片放到指定文件夹,输入水平像素点击开始就会改好照片像素放到另一个文件夹里。如果只有一两张照片需要处理也可以直接拖到程序上。

有两个主要操作。一是文件,二是图片。都运用了封装好的类。界面用的是MFC。
创建MFC工程,将界面控件弄好并关联变量。之后就开始做主要工作了。
首先这个程序会自己创建存放照片的目录。我使用了CreateDirectory函数。这个函数的好处就是没有指定目录会自己创建,有就不会再次创建。正符合需求。
1 CreateDirectory(L"E:\\新闻部照片",NULL); //因为只在部门内用,所以为了方便就把目录写死了 2 CreateDirectory(L"E:\\新闻部照片\\待处理",NULL); 3 CreateDirectory(L"E:\\新闻部照片\\已处理",NULL);
然后就是文件上的操作:遍历源目录、清空目录。我这里用的是CFileFind类。
1 VOID FindAllFile(CString csOldDirectoryPath,CString csNewDirectoryPath) 2 { 3 4 CFileFind FileFind; 5 CString strPath = csOldDirectoryPath; 6 CString csNewName; 7 UINT ulFileNum = 0; 8 BOOL bRet; 9 10 if (strPath.Right(1) != "\\") 11 { 12 strPath += "\\"; 13 } 14 15 strPath += "*.*"; 16 17 ulFileNum = GetDirectoryFileNum(strPath); //这个函数是自己实现的,目录内文件数量 18 19 if (ulFileNum == -1) 20 { 21 return; 22 } 23 else if (ulFileNum == 0) 24 { 25 MessageBox(L"源目录为空",L"Attention" ,MB_OK); 26 } 27 28 if (FileFind.FindFile(strPath)) 29 { 30 do 31 { 32 bRet = FileFind.FindNextFile(); 33 if (FileFind.IsDots()) 34 { 35 continue; 36 } 37 strPath = FileFind.GetFilePath(); 38 if (!FileFind.IsDirectory()) 39 { 40 if (/*****/) 41 { 42 /******/ 43 } 44 else 45 { 46 continue; 47 } 48 } 49 else 50 { 51 continue; 52 } 53 } while (bRet); 54 } 55 56 UpdateData(TRUE); 57 if (m_IsEmpty == TRUE) 58 { 59 EmptyDirectory2(csOldPath); //操作完成后清空源目录 60 } 61 62 }
然后就是之前if中省略的代码,判断是否为jpg格式,是就进行处理。处理照片用的是CImage类
1 bool ChangeJPGSize(CString szOldFileName, CString szNewFilName) 2 { 3 UpdateData(TRUE); 4 int WIDTH = m_ulWidth; //m_ulWidth为用户设置的水平像素值 5 int HEIGHT = m_ulWidth; 6 CImage oldimg; 7 CImage newimg; 8 oldimg.Load(szOldFileName); 9 if(oldimg.IsNull()) 10 return FALSE; 11 int nWidth = 0; 12 int nHeight = 0; 13 14 nWidth = oldimg.GetWidth(); 15 nHeight = oldimg.GetHeight(); 16 17 if(nWidth > WIDTH) 18 { 19 double dRatio = nWidth * 1.0 / nHeight; 20 if(nWidth > nHeight) //只要横排的照片,即宽大于稿 21 { 22 nWidth = WIDTH; 23 nHeight = nWidth / dRatio; 24 } 25 else 26 { 27 return FALSE; 28 } 29 } 30 else 31 { 32 return FALSE; 33 } 34 35 if(!newimg.CreateEx(nWidth, nHeight, 24, BI_RGB)) 36 { 37 oldimg.Destroy(); 38 return FALSE; 39 } 40 41 int nPreMode = ::SetStretchBltMode(newimg.GetDC(), HALFTONE); 42 newimg.ReleaseDC(); 43 oldimg.Draw(newimg.GetDC(), 0, 0, nWidth, nHeight, 0, 0, oldimg.GetWidth(), oldimg.GetHeight()); 44 newimg.ReleaseDC(); 45 ::SetBrushOrgEx(newimg.GetDC(), 0, 0, NULL); 46 newimg.ReleaseDC(); 47 ::SetStretchBltMode(newimg.GetDC(), nPreMode); 48 newimg.ReleaseDC(); 49 50 BOOL bOk = newimg.Save(szNewFilName); 51 52 if (bOk != 0) 53 { 54 // MessageBox(L"保存已处理照片错误,请检查路径是否有效",L"Error",MB_OK|MB_ICONERROR); 55 } 56 newimg.Destroy(); 57 oldimg.Destroy(); 58 59 return TRUE; 60 }
核心代码就是这些。在加上进度条、清空文件夹等等代码就构成了这个程序。
因为这是自己刚入门时写的,所有现在看有很多问题:
1、变量名命名不规范
2、因为目标用户只是部门里十几个人,所以程序不够灵活。比如源目录和目标目录应该让用户设,用ini文件保存。
3、所有函数都封在Dlg类中,但是有些函数操作类成员变量事通过参数,多此一举。
代码地址:https://github.com/HollyDi/Garden
浙公网安备 33010602011771号