⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exifinfo.cpp

📁 随着计算机信息技术的飞速发展
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -