您的位置:首页 > 编程语言 > C语言/C++

照片处理小工具三合一设计到实现(三)

2017-11-17 16:24 169 查看
这个需求其实是工具二,也就是缩放照片,保留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;
}


于是三个小软件就分别完成了,然后把三个小软件合成一个小软件,没什么技术含量。(结束)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc 图片 软件 c++