如何添加';评论';使用MFC复制到JPEG文件

如何添加';评论';使用MFC复制到JPEG文件,mfc,exif,Mfc,Exif,在JPEG图像的属性窗口中,有一个名为“摘要”的选项卡。在这个选项卡中,有一个名为“Comments”的字段,我想编写一些MFC代码,它将向该字段添加一个给定的字符串,例如“this is a photo” 有什么善良的灵魂知道怎么做吗 非常感谢。MFC不提供此功能,但是您可以将其用于此任务。该类能够读取和写入Exif元数据 这几乎是微不足道的,并在下面进行了解释。然而,由于UserComment元数据标记允许不同的字符编码,所以事情变得更加复杂。以下代码(1)实现了一个命令行实用程序,允许设置

在JPEG图像的属性窗口中,有一个名为“摘要”的选项卡。在这个选项卡中,有一个名为“Comments”的字段,我想编写一些MFC代码,它将向该字段添加一个给定的字符串,例如“this is a photo”

有什么善良的灵魂知道怎么做吗


非常感谢。

MFC不提供此功能,但是您可以将其用于此任务。该类能够读取和写入Exif元数据

这几乎是微不足道的,并在下面进行了解释。然而,由于UserComment元数据标记允许不同的字符编码,所以事情变得更加复杂。以下代码(1)实现了一个命令行实用程序,允许设置(或替换,如果存在)UserComment字段:

#包括
#包括
使用名称空间Gdiplus;
#pragma注释(lib,“Gdiplus.lib”)
int wmain(int argc,const wchar\u t*argv[]{
//输入格式:AddExifComment“”
如果(argc!=4)
返回-1;
//初始化GDI+
GdiplusStartupInput GdiplusStartupInput;
ULONG_PTR gdiplusToken{0};
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,nullptr);
//加载图像
图像*img=新图像(argv[1]);
//构造Unicode注释
const auto&comment=MakeUnicodeComment(argv[2]);
//分配UserComment属性
PropertyItem PropertyItem;
propertyItem.id=PropertyTagExifUserComment;
propertyItem.length=comment.size();
propertyItem.type=PropertyTagTypeUndefined;
propertyItem.value=(void*)comment.data();
img->SetPropertyItem(&propertyItem);
//保存图像
CLSID-CLSID;
GetEncoderClsid(L“图像/jpeg”和&clsid);
img->Save(argv[3],&clsid);
//清理
删除img;
GdiplusShutdown(gdiplusToken);
返回0;
}
构造一个适当格式的注释需要一些工作。这在以下功能中实现:

#包括
使用std::vector;
#包括
使用std::back_插入器;
矢量编码(常量wchar\u t*text){
//Unicode(UCS-2)的Exif 2.2标头:“U”、“N”、“I”、“C”、“O”、“D”、“E”和“\0”
静态常量字符头[]{“UNICODE”};
静态常量size_t headerSize{sizeof(header)/sizeof(header[0]);
//UserComment字段包含8字节头,后跟UTF-16LE编码的代码单元
向量缓冲区;
标准::复制(标题、标题+标题化、后插入器(缓冲区));
//附加注释文本(不需要NUL终止符)
自动当前=文本;
while(*当前){
缓冲区。推回(*当前和0xFF);
buffer.push_back((*当前>>8)和0xFF);
++电流;
}
返回缓冲区;
}
从其MIME类型检索JPEG编码器复制自,以供参考:

int GetEncoderClsid(常量WCHAR*格式,CLSID*pClsid){
UINT num=0;//图像编码器的数量
UINT size=0;//图像编码器数组的大小(字节)
ImageCodecInfo*pImageCodecInfo=NULL;
GetImageEncodersSize(&num,&size);
如果(大小==0)
返回-1;//失败
pImageCodecInfo=(ImageCodecInfo*)(malloc(size));
如果(pImageCodecInfo==NULL)
返回-1;//失败
GetImageEncoders(num、size、pImageCodecInfo);
对于(UINT j=0;j


1) 为简洁起见,错误处理被省略。

好的,我终于设法解决了这个问题!代码如下:

好的,我终于解决了这个问题!代码如下:
#包括“stdafx.h”
#包括
#包括
#包括
使用名称空间Gdiplus;
#pragma注释(lib,“gdiplus.lib”)
int GetEncoderClsid(常量WCHAR*格式,CLSID*pClsid)
{
UINT num=0;
UINT大小=0;
ImageCodecInfo*pImageCodecInfo=NULL;
GetImageEncodersSize(&num,&size);
如果(大小==0)
{
返回-1;
}
pImageCodecInfo=(ImageCodecInfo*)(malloc(size));
如果(pImageCodecInfo==NULL)
{
返回-1;
}
GetImageEncoders(num、size、pImageCodecInfo);
对于(UINT j=0;j设置大小(uli);
如果(流->写入(内存、大小、空)==S\U OK)
bmp=新位图(流);
流->释放();
}
返回bmp;
}
//从文件加载位图,同步方式
位图*LoadBitmapFromFile(常量TCHAR*文件名)
{
位图*bmp=NULL;
HANDLE file\u HANDLE=CreateFile(文件名、通用读取、文件共享读取、NULL、打开现有、文件属性正常、NULL);
if(文件\u句柄!=无效的\u句柄\u值)
{
德沃德温度=0;
DWORD文件大小=GetFileSize(文件句柄和临时文件);
if(file_size&&!temp)//文件必须小于4G
{
unsigned char*buffer=新的unsigned char[文件大小];
if(ReadFile(文件句柄、缓冲区、文件大小和临时值、NULL))
bmp=LoadBitmapFromMemory(缓冲区,临时);
删除[]缓冲区;
}
CloseHandle(文件句柄);
}
返回bmp;
}
int _tmain(int argc,_TCHAR*argv[]
{
GdiplusStartupInput GdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
状态统计;
CLSID-CLSID;
char propertyValue[]=“假照片”