📄 exifinfo.cpp
字号:
#include "StdAfx.h"
#include "exifinfo.h"
CExifInfo::CExifInfo(void)
{
m_ExifProp.InitHashTable(UINT(100*1.2));
}
CExifInfo::~CExifInfo(void)
{
m_ExifProp.RemoveAll();
}
void CExifInfo::GetPhotoProp(HWND hWnd,CString file)
{
USES_CONVERSION;
HDC hDC=GetDC(hWnd);
Graphics graph(hDC);
UINT PropSize,ExifCount,i;
PropSize=ExifCount=0;
Bitmap photo(T2W(file));
photo.GetPropertySize(&PropSize,&ExifCount);
PropertyItem* pPropItems=(PropertyItem*)new BYTE[PropSize];
photo.GetAllPropertyItems(PropSize,ExifCount,pPropItems);
m_ExifProp.RemoveAll();
for(i=0;i<ExifCount;++i)
{
switch(pPropItems[i].type)
{
case 1:
ProcessType1(pPropItems,i);
break;
case 2:
ProcessType2(pPropItems,i);
break;
case 3:
ProcessType3(pPropItems,i);
break;
case 4:
ProcessType4(pPropItems,i);
break;
case 5:
ProcessType5(pPropItems,i);
break;
case 7:
ProcessType7(pPropItems,i);
break;
case 9:
ProcessType9(pPropItems,i);
break;
case 10:
ProcessType10(pPropItems,i);
break;
default:
break;
}
}
ReleaseDC(hWnd,hDC);
delete[]pPropItems;
pPropItems=0;
}
void CExifInfo::ProcessType1(PropertyItem* pPropItems,UINT i)
{
ExifInfo ei;
UCHAR value;
ei.tag=ei.name=ei.info="";
value=*(UCHAR*)pPropItems[i].value;
switch(pPropItems[i].id)
{
case 0x500F:
ei.tag="PropertyTagHalftoneScreen";
ei.name="使用打印机缺省屏幕";
if(1==value) ei.info="是";
else if(2==value) ei.info="否";
break;
case 0x501B:
ei.tag="PropertyTagThumbnailData";
ei.name="缩略图数据";
ei.info=ProcessBinData((LPBYTE)pPropItems[i].value,pPropItems[i].length);
break;
case 0x8773:
ei.tag="PropertyTagICCProfile";
ei.name="ICC 配置";
ei.info=ProcessBinData((LPBYTE)pPropItems[i].value,pPropItems[i].length);
break;
default:
break;
}
m_ExifProp[ei.tag]=ei;
}
void CExifInfo::ProcessType2(PropertyItem* pPropItems,UINT i)
{
ExifInfo ei;
ei.tag=ei.name=ei.info="";
switch(pPropItems[i].id)
{
case 0x010E:
ei.tag="PropertyTagImageDescription";
ei.name="照片标题";
ei.info=(LPTSTR)pPropItems[i].value;
break;
case 0x010F:
ei.tag="PropertyTagEquipMake";
ei.name="生产厂商";
ei.info=(LPTSTR)pPropItems[i].value;
break;
case 0x0110:
ei.tag="PropertyTagEquipModel";
ei.name="设备型号";
ei.info=(LPTSTR)pPropItems[i].value;
break;
case 0x0131:
ei.tag="PropertyTagSoftwareUsed";
ei.name="固件版本";
ei.info=(LPTSTR)pPropItems[i].value;
break;
case 0x0132:
ei.tag="PropertyTagDateTime";
ei.name="修改时间";
ei.info=(LPTSTR)pPropItems[i].value;
break;
case 0x8298:
ei.tag="PropertyTagCopyright";
ei.name="版权信息";
ei.info=(LPTSTR)pPropItems[i].value;
break;
case 0x9003:
ei.tag="PropertyTagExifDTOrig";
ei.name="拍摄时间";
if(pPropItems[i].length>0)
{
if(*(LPBYTE)pPropItems[i].value!='2') *(LPBYTE)pPropItems[i].value='2';
ei.info=(LPTSTR)pPropItems[i].value;
}
else ei.info="未知";
break;
case 0x9004:
ei.tag="PropertyTagExifDTDigitized";
ei.name="数字化日期";
if(pPropItems[i].length>0)
{
if(*(LPBYTE)pPropItems[i].value!='2') *(LPBYTE)pPropItems[i].value='2';
ei.info=(LPTSTR)pPropItems[i].value;
}
else ei.info="未知";
break;
case 0x9290:
ei.tag="PropertyTagExifDTSubsec";
ei.name="次要日期标记";
ei.info=(LPTSTR)pPropItems[i].value;
break;
case 0x9291:
ei.tag="PropertyTagExifDTOrigSS";
ei.name="次要原始日期标识";
ei.info=(LPTSTR)pPropItems[i].value;
break;
case 0x9292:
ei.tag="PropertyTagExifDTDigSS";
ei.name="次要数字化日期标识";
ei.info=(LPTSTR)pPropItems[i].value;
break;
case 0xA004:
ei.tag="PropertyTagExifRelatedWav";
ei.name="音频文件";
ei.info=(LPTSTR)pPropItems[i].value;
break;
default:
break;
}
m_ExifProp[ei.tag]=ei;
}
void CExifInfo::ProcessType3(PropertyItem* pPropItems,UINT i)
{
ExifInfo ei;
USHORT value;
TCHAR info[80];
ei.tag=ei.name=ei.info="";
value=*(LPWORD)(LPBYTE)pPropItems[i].value;
switch(pPropItems[i].id)
{
case 0x0112:
ei.tag="PropertyTagOrientation";
ei.name="原点位置";
switch(value)
{
case 1:
ei.info="左上";
break;
case 2:
ei.info="右上";
break;
case 3:
ei.info="右下";
break;
case 4:
ei.info="左下";
break;
case 5:
ei.info="上左";
break;
case 6:
ei.info="上右";
break;
case 7:
ei.info="下右";
break;
case 8:
ei.info="下左";
break;
default:
break;
}
break;
case 0x0128:
ei.tag="PropertyTagResolutionUnit";
ei.name="分辨率单位";
if(2==value) ei.info=="英寸";
else if(3==value) ei.info="厘米";
break;
case 0x0213:
ei.tag="PropertyTagYCbCrPositioning";
ei.name="色度/亮度";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x5001:
ei.tag="PropertyTagResolutionXUnit";
ei.name="水平显示分辨率单位";
if(1==value) ei.info="英寸";
else if(2==value) ei.info="厘米";
break;
case 0x5002:
ei.tag="PropertyTagResolutionYUnit";
ei.name="垂直显示分辨率单位";
if(1==value) ei.info="英寸";
else if(2==value) ei.info="厘米";
break;
case 0x5003:
ei.tag="PropertyTagResolutionXLengthUnit";
ei.name="照片水平显示单位";
switch(value)
{
case 1:
ei.info="英寸";
break;
case 2:
ei.info="厘米";
break;
case 3:
ei.info="点";
break;
case 4:
ei.info="印花";
break;
case 5:
ei.info="列";
break;
default:
break;
}
break;
case 0x5004:
ei.tag="PropertyTagResolutionYLengthUnit";
ei.name="照片垂直显示单位";
switch(value)
{
case 1:
ei.info="英寸";
break;
case 2:
ei.info="厘米";
break;
case 3:
ei.info="点";
break;
case 4:
ei.info="印花";
break;
case 5:
ei.info="列";
break;
default:
break;
}
break;
case 0x5006:
ei.tag="PropertyTagPrintFlagsVersion";
ei.name="打印标记志版本";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x5009:
ei.tag="PropertyTagPrintFlagsBleedWidthScale";
ei.name="出血打印宽度范围";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x500B:
ei.tag="PropertyTagHalftoneLPIUnit";
ei.name="屏幕频率单位";
if(1==value) ei.info="英寸";
else if(2==value) ei.info="厘米";
break;
case 0x500D:
ei.tag="PropertyTagHalftoneShape";
ei.name="半色调点形状";
switch(value)
{
case 0:
ei.info="圆形";
break;
case 1:
ei.info="椭圆";
break;
case 2:
ei.info="线状";
break;
case 3:
ei.info="正方形";
break;
case 4:
ei.info="十字";
break;
case 6:
ei.info="菱形";
break;
default:
break;
}
break;
case 0x5015:
ei.tag="PropertyTagThumbnailColorDepth";
ei.name="缩略图发色数";
sprintf(info,"%d 位",value);
ei.info=info;
break;
case 0x5016:
ei.tag="PropertyTagThumbnailPlanes";
ei.name="缩略图位面数";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x5023:
ei.tag="PropertyTagThumbnailCompression";
ei.name="缩略图方式";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x5030:
ei.tag="PropertyTagThumbnailResolutionUnit";
ei.name="缩略图分辨率单位";
if(2==value) ei.info="英寸";
else if(3==value) ei.info="厘米";
break;
case 0x5090:
ei.tag="PropertyTagLuminanceTable";
ei.name="亮度表";
ei.info=ProcessBinData((LPBYTE)pPropItems[i].value,pPropItems[i].length);
break;
case 0x5091:
ei.tag="PropertyTagChrominanceTable";
ei.name="色度表";
ei.info=ProcessBinData((LPBYTE)pPropItems[i].value,pPropItems[i].length);
break;
case 0x8822:
ei.tag="PropertyTagExifExposureProg";
ei.name="曝光模式";
switch(value)
{
case 0:
ei.info="未定义";
break;
case 1:
ei.info="手动模式";
break;
case 2:
ei.info="自动模式";
break;
case 3:
ei.info="光圈优先";
break;
case 4:
ei.info="快门优先";
break;
case 5:
ei.info="运动模式";
break;
case 6:
ei.info="连拍模式";
break;
case 7:
ei.info="人像模式";
break;
case 8:
ei.info="风景模式";
break;
default:
ei.info="保留";
break;
}
break;
case 0x8827:
ei.tag="PropertyTagExifISOSpeed";
ei.name="ISO 感光度";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x9207:
ei.tag="PropertyTagExifMeteringMode";
ei.name="测光模式";
switch(value)
{
case 0:
ei.info="自动测光";
break;
case 1:
ei.info="平均测光";
break;
case 2:
ei.info="中央重点平均测光";
break;
case 3:
ei.info="采样点测光";
break;
case 4:
ei.info="多重采样点测光";
break;
case 5:
ei.info="多段测光";
break;
case 6:
ei.info="区域评价测光";
break;
case 255:
ei.info="其它模式";
break;
default:
ei.info="保留";
break;
}
break;
case 0x9208:
ei.tag="PropertyTagExifLightSource";
ei.name="白平衡";
switch(value)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -