照片处理小工具三合一设计到实现(三)
2017-11-17 16:24
169 查看
这个需求其实是工具二,也就是缩放照片,保留EXIF信息的一个翻版,只是单独提取出来供可能的需要。
比如用某些软件处理之后的照片,希望加上原来图片的的exif信息等。
当然,请不要把这个功能用在奇怪的用途上谢谢。
核心代码:
于是三个小软件就分别完成了,然后把三个小软件合成一个小软件,没什么技术含量。(结束)
比如用某些软件处理之后的照片,希望加上原来图片的的exif信息等。
当然,请不要把这个功能用在奇怪的用途上谢谢。
核心代码:
int CCloneExif::ClonePicExif(const char* pInputPath, const char* pSavePath, const int& nProcessIndex) { CGdalUser gu; if (!gu.Initialize(pSavePath)) { return -1; } //获取exif信息 ExifPathsTags pathsTags; ExifImageFile inImageFile; ExifStatus status(EXIF_INVALID_FORMAT_ERROR); ExifStatus openStatus(EXIF_INVALID_FORMAT_ERROR); std::string dstExtension = CStdStr::ToUpperLower(CStdStr::GetSuffixOfFile(pInputPath)); bool bExif = 0 == strcmp(dstExtension.c_str(), ".jpg") || 0 == strcmp(dstExtension.c_str(), ".jpeg"); if (bExif) { openStatus = inImageFile.open(pInputPath, "r+"); if (openStatus != EXIF_OK) //不能用w打开照片,打开后会重新创建一张照片并将原来的照片覆盖掉 { inImageFile.close(); } status = inImageFile.getAllTags(0xFFE1, "Exif", pathsTags) ; if (status != EXIF_OK) { inImageFile.close(); } } int nNewWidth = -1, nNewHeight = -1; unsigned char* pData = nullptr; bool bGif = 0 == strcmp(dstExtension.c_str(), ".gif"); //增加exif信息,保存为jpg std::string sSavePath = CStdStr::ReplaceSuffix(pSavePath, ".jpg"); if (bGif) { //Gif文件需要单独处理 if (CxImageUser::gif2jpg(CStdStr::s2ws(pSavePath), CStdStr::s2ws(sSavePath))) { g_vLog[nProcessIndex] = (std::string(pInputPath) + "->" + std::string(sSavePath) + '\n'); } else { //保存失败 g_vLog[nProcessIndex] = ("CloneExif" + std::string(pInputPath) + " Failed!" + '\n'); return -1; } } else if(gu.readImageGDAL(&pData, nNewWidth, nNewHeight, gu.m_nBandNum, pSavePath)) { //保存结果 if (gu.WriteImageGDAL(sSavePath.c_str(), pData, nNewWidth, nNewHeight, gu.m_nBandNum)) { if (status == EXIF_OK) { SetPicExifInfo(sSavePath.c_str(), pathsTags); } g_vLog[nProcessIndex] = (std::string(pInputPath) + "->" + std::string(pSavePath) + '\n'); } else { //保存失败 g_vLog[nProcessIndex] = ("CloneExif" + std::string(pInputPath) + " Failed!" + '\n'); return -1; } delete[] pData; pData = nullptr; } return 0; }
于是三个小软件就分别完成了,然后把三个小软件合成一个小软件,没什么技术含量。(结束)
相关文章推荐
- 照片处理小工具三合一设计到实现(二)
- 照片处理小工具三合一设计到实现(一)
- 第五章 工作流定义工具的设计与实现(四)
- 自己动手实现STL 03:内存基本处理工具(stl_uninitialized.h)
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 数据库分表处理设计思想和实现
- python处理计算机辅助设计软件文字信息并实现排序输出
- 借助OpenCV实现照片中图像的处理1
- 基于GMF的流程分析工具的设计与实现构思
- 关系数据库数据模型设计及设计工具PowerDesigner中实现CDM(概念模型)设计并转化为PDM(物理模型)
- 基于XML的API自动化测试工具设计与实现
- Windows 进程管理工具的设计与实现
- 分表处理设计思想和实现
- 公司评估综合业务处理系统的设计与实现
- 病历智能处理引擎的设计、实现和应用
- 用Canvas+Javascript FileAPI 实现一个跨平台的图片剪切、滤镜处理、上传下载工具
- 第五章 工作流定义工具的设计与实现(五)
- 分表处理设计思想和实现
- 基于RMI的即时通讯工具的设计与实现