📄 exifinfo.cpp
字号:
case 0:
ei.info="自动";
break;
case 1:
ei.info="白炽灯";
break;
case 2:
ei.info="荧光灯";
break;
case 3:
ei.info="钨丝灯";
break;
case 17:
ei.info="标准光照A";
break;
case 18:
ei.info="标准光照B";
break;
case 19:
ei.info="标准光照C";
break;
case 20:
ei.info="D55";
break;
case 21:
ei.info="D65";
break;
case 22:
ei.info="D75";
break;
case 255:
ei.info="其它类型";
break;
default:
ei.info="保留";
break;
}
break;
case 0x9209:
ei.tag="PropertyTagExifFlash";
ei.name="闪光灯状态";
if(0==(value&0x0001)) ei.info="没开闪光灯 ";
else ei.info="打开闪光灯 ";
if(0==((value>>1)&0x0003)) ei.info+="无光阑返回检测";
else if(2==((value>>1)&0x0003)) ei.info+="光阑返回未检测";
else if(3==((value>>1)&0x0003)) ei.info+="光阑返回已检测";
else ei.info+="保留";
break;
case 0xA001:
ei.tag="PropertyTagExifColorSpace";
ei.name="颜色空间";
if(1==value) ei.info="sRGB";
else if(0xFFFF==value) ei.info="未校准";
else ei.info="保留";
break;
case 0xA002:
ei.tag="PropertyTagExifPixXDim";
ei.name="拍摄宽度";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0xA003:
ei.tag="PropertyTagExifPixYDim";
ei.name="拍摄高度";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0xA210:
ei.tag="PropertyTagExifFocalResUnit";
ei.name="焦点分辨率单位";
if(2==value) ei.info="英寸";
else if(3==value) ei.info="厘米";
break;
case 0xA217:
ei.tag="PropertyTagExifSensingMethod";
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 7:
ei.info="三线性传感器";
break;
case 8:
ei.info="彩色连续线性传感器";
break;
default:
ei.info="保留";
break;
}
break;
default:
break;
}
m_ExifProp[ei.tag]=ei;
}
void CExifInfo::ProcessType4(PropertyItem* pPropItems,UINT i)
{
ExifInfo ei;
ULONG value;
TCHAR info[80];
ei.tag=ei.name=ei.info="";
value=*(ULONG*)(LPBYTE)pPropItems[i].value;
switch(pPropItems[i].id)
{
case 0x0201:
ei.tag="PropertyTagJPEGInterFormat";
ei.name="JPEG 数据位置";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x0202:
ei.tag="PropertyTagJPEGInterLength";
ei.name="JPEG 数据长度";
sprintf(info,"%d 字节",value);
ei.info=info;
break;
case 0x5008:
ei.tag="PropertyTagPrintFlagsBleedWidth";
ei.name="出血打印宽度";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x5012:
ei.tag="PropertyTagThumbnailFormat";
ei.name="缩略图格式";
if(0==value) ei.info="原生 RGB 格式";
else if(1==value) ei.info="JPEG 格式";
break;
case 0x5013:
ei.tag="PropertyTagThumbnailWidth";
ei.name="缩略图宽度";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x5014:
ei.tag="PropertyTagThumbnailHeight";
ei.name="缩略图高度";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0x5017:
ei.tag="PropertyTagThumbnailRawBytes";
ei.name="缩略图行程长度";
sprintf(info,"%d 字节",value);
ei.info=info;
break;
case 0x5018:
ei.tag="PropertyTagThumbnailSize";
ei.name="缩略图大小";
sprintf(info,"%d 字节",value);
ei.info=info;
break;
case 0x5019:
ei.tag="PropertyTagThumbnailCompressedSize";
ei.name="缩略图压缩后大小";
sprintf(info,"%d 字节",value);
ei.info=info;
break;
case 0xA002:
ei.tag="PropertyTagExifPixXDim";
ei.name="拍摄宽度";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0xA003:
ei.tag="PropertyTagExifPixYDim";
ei.name="拍摄高度";
sprintf(info,"%d",value);
ei.info=info;
break;
case 0xA005:
ei.tag="PropertyTagExifInterop";
ei.name="辅助信息位置";
sprintf(info,"%d",value);
ei.info=info;
break;
default:
break;
}
m_ExifProp[ei.tag]=ei;
}
void CExifInfo::ProcessType5(PropertyItem* pPropItems,UINT i)
{
ExifInfo ei;
TCHAR info[80];
ULONG numerator,denominator;
ei.tag=ei.name=ei.info="";
numerator=*(UINT*)((LPBYTE)pPropItems[i].value);
denominator=*(UINT*)((LPBYTE)pPropItems[i].value+4);
switch(pPropItems[i].id)
{
case 0x011A:
ei.tag="PropertyTagXResolution";
ei.name="水平分辨率";
sprintf(info,"%d",numerator/denominator);
ei.info=info;
break;
case 0x011B:
ei.tag="PropertyTagYResolution";
ei.name="垂直分辨率";
sprintf(info,"%d",numerator/denominator);
ei.info=info;
break;
case 0x500A:
ei.tag="PropertyTagHalftoneLPI";
ei.name="墨水屏幕频率";
sprintf(info,"%.2f",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x500C:
ei.tag="PropertyTagHalftoneDegree";
ei.name="屏幕角度";
sprintf(info,"%.2f",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x502D:
ei.tag="PropertyTagThumbnailResolutionX";
ei.name="缩略图水平分辨率";
sprintf(info,"%d",numerator/denominator);
ei.info=info;
break;
case 0x502E:
ei.tag="PropertyTagThumbnailResolutionY";
ei.name="缩略图垂直分辨率";
sprintf(info,"%d",numerator/denominator);
ei.info=info;
break;
case 0x829A:
ei.tag="PropertyTagExifExposureTime";
ei.name="曝光时间";
if(0==denominator%numerator) sprintf(info,"%d/%d 秒",1,denominator/numerator);
else sprintf(info,"%.2f 秒",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x829D:
ei.tag="PropertyTagExifFNumber";
ei.name="光圈尺寸";
sprintf(info,"F%.2f",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x9102:
ei.tag="PropertyTagExifCompBPP";
ei.name="压缩数据发色数";
sprintf(info,"%d",numerator/denominator);
ei.info=info;
break;
case 0x9202:
ei.tag="PropertyTagExifAperture";
ei.name="镜头孔径";
sprintf(info,"%.2f 毫米",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x9204:
ei.tag="PropertyTagExifExposureBias";
ei.name="曝光补偿";
sprintf(info,"%.2f EV",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x9205:
ei.tag="PropertyTagExifMaxAperture";
ei.name="最小光圈尺寸";
sprintf(info,"F%.2f",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x920A:
ei.tag="PropertyTagExifFocalLength";
ei.name="焦距长度";
sprintf(info,"%.2f 毫米",1.0f*numerator/denominator);
ei.info=info;
break;
case 0xA20E:
ei.tag="PropertyTagExifFocalXRes";
ei.name="焦点宽度分辨率";
sprintf(info,"%d",numerator/denominator);
ei.info=info;
break;
case 0xA20F:
ei.tag="PropertyTagExifFocalYRes";
ei.name="焦点高度分辨率";
sprintf(info,"%d",numerator/denominator);
ei.info=info;
break;
case 0xA215:
ei.tag="PropertyTagExifExposureIndex";
ei.name="曝光索引";
sprintf(info,"%d",numerator/denominator);
ei.info=info;
break;
default:
break;
}
m_ExifProp[ei.tag]=ei;
}
void CExifInfo::ProcessType7(PropertyItem* pPropItems,UINT i)
{
UINT j;
ExifInfo ei;
TCHAR info[80];
ei.tag=ei.name=ei.info="";
switch(pPropItems[i].id)
{
case 0x5010:
ei.tag="PropertyTagJPEGQuality";
ei.name="JPEG 品质";
ei.info=ProcessBinData((LPBYTE)pPropItems[i].value,pPropItems[i].length);
break;
case 0x5011:
ei.tag="PropertyTagGridSize";
ei.name="网格信息";
ei.info=ProcessBinData((LPBYTE)pPropItems[i].value,pPropItems[i].length);
break;
case 0x501A:
ei.tag="PropertyTagColorTransferFunction";
ei.name="色彩变换表";
ei.info=ProcessBinData((LPBYTE)pPropItems[i].value,pPropItems[i].length);
break;
case 0x9000:
ei.tag="PropertyTagExifVer";
ei.name="Exif 版本";
*((LPTSTR)pPropItems[i].value+pPropItems[i].length)='\0';
sprintf(info,"%s",(LPTSTR)pPropItems[i].value);
ei.info=info;
break;
case 0x9101:
ei.tag="PropertyTagExifCompConfig";
ei.name="压缩配置";
for(j=0;j<pPropItems[i].length;++j)
*((LPTSTR)pPropItems[i].value+j)+='0';
*((LPTSTR)pPropItems[i].value+pPropItems[i].length)='\0';
if(0==StrCmp((LPTSTR)pPropItems[i].value,"1230")) sprintf(info,"%s","RGB");
else if(0==StrCmp((LPTSTR)pPropItems[i].value,"4560")) sprintf(info,"%s","YCbCr");
ei.info=info;
break;
case 0x927C:
ei.tag="PropertyTagExifMakerNote";
ei.name="记录标识";
ei.info=ProcessBinData((LPBYTE)pPropItems[i].value,pPropItems[i].length);
break;
case 0x9286:
ei.tag="PropertyTagExifUserComment";
ei.name="注释标识";
ei.info=ProcessBinData((LPBYTE)pPropItems[i].value,pPropItems[i].length);
break;
case 0xA000:
ei.tag="PropertyTagExifFPXVer";
ei.name="FlashPix 版本";
*((LPTSTR)pPropItems[i].value+pPropItems[i].length)='\0';
if(0==StrCmp((LPTSTR)pPropItems[i].value,"0100")) sprintf(info,"%s","1.0");
else sprintf(info,"%s","保留");
ei.info=info;
break;
case 0xA300:
ei.tag="PropertyTagExifFileSource";
ei.name="照片来源";
if(3==*(LPBYTE)pPropItems[i].value) sprintf(info,"%s","数码相机");
else sprintf(info,"%s","其它");
ei.info=info;
break;
case 0xA301:
ei.tag="PropertyTagExifSceneType";
ei.name="场景类型";
sprintf(info,"%d",*(LPBYTE)pPropItems[i].value);
ei.info=info;
break;
case 0xA302:
ei.tag="PropertyTagExifCfaPattern";
ei.name="CFA 模式";
sprintf(info,"%s","用于单芯片彩色区域传感器");
ei.info=info;
break;
default:
break;
}
m_ExifProp[ei.tag]=ei;
}
void CExifInfo::ProcessType9(PropertyItem* pPropItems,UINT i)
{
ExifInfo ei;
LONG value;
ei.tag=ei.name=ei.info="";
value=*(LPLONG)(LPBYTE)pPropItems[i].value;
}
void CExifInfo::ProcessType10(PropertyItem* pPropItems,UINT i)
{
ExifInfo ei;
TCHAR info[80];
LONG numerator,denominator;
ei.tag=ei.name=ei.info="";
numerator=*(LPLONG)((LPBYTE)pPropItems[i].value);
denominator=*(LPLONG)((LPBYTE)pPropItems[i].value+4);
switch(pPropItems[i].id)
{
case 0x9201:
ei.tag="PropertyTagExifShutterSpeed";
ei.name="快门速度";
sprintf(info,"%.2f 秒",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x9202:
ei.tag="PropertyTagExifAperture";
ei.name="镜头孔径";
sprintf(info,"%.2f 毫米",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x9203:
ei.tag="PropertyTagExifBrightness";
ei.name="亮度值";
sprintf(info,"%.2f",1.0f*numerator/denominator);
ei.info=info;
break;
case 0x9204:
ei.tag="PropertyTagExifExposureBias";
ei.name="曝光补偿";
sprintf(info,"%.2f EV",1.0f*numerator/denominator);
ei.info=info;
break;
default:
break;
}
m_ExifProp[ei.tag]=ei;
}
CString CExifInfo::ProcessBinData(LPBYTE pBinData,UINT length)
{
CString info;
TCHAR tip[5];
UINT i;
for(i=0;i<min(length,10);++i)
{
sprintf(tip,"%02X ",pBinData[i]);
info+=tip;
}
if(length>10) info+="...";
return(info);
}
BOOL CExifInfo::GetNameAndInfoByTag(CString tag,ExifInfo& ei)
{
ei.tag=ei.name=ei.info="";
ei=m_ExifProp[tag];
if(tag==ei.tag) return(1);
else return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -