📄 format_canon.c
字号:
static ExifTextList CanonSet1ConSatSharp[] = { { 0, "normal" }, { 1, "high" }, { 65535,"low" }, EXIF_TEXT_LIST_END};static ExifTextList CanonSet1ISOSpeed[] = {/* { 0, "not set/see EXIF tag" }, */ { 15, "auto" }, { 16, "50" }, { 17, "100" }, { 18, "200" }, { 19, "400" }, EXIF_TEXT_LIST_END};static ExifTextList CanonSet1MeteringMode[] = { { 0, "default" }, { 1, "spot" }, { 3, "evaluative" }, { 4, "partial" }, { 5, "center-weighted" }, EXIF_TEXT_LIST_END};static ExifTextList CanonSet1FocusType[] = { { 0, "manual" }, { 1, "auto" }, { 2, "auto" }, { 3, "macro" }, { 7, "infinity" }, { 8, "locked" }, EXIF_TEXT_LIST_END};static ExifTextList CanonSet1AutoFocusPoint[] = { { 0x2005, "manual AF point selection" }, { 0x3000, "manual focus" }, { 0x3001, "auto" }, { 0x3002, "right" }, { 0x3003, "center" }, { 0x3004, "left" }, { 0x4001, "auto AF point selection" }, EXIF_TEXT_LIST_END};static ExifTextList CanonSet1ExposureMode[] = { { 0, "auto" }, { 1, "program" }, { 2, "Tv priority" }, { 3, "Av priority" }, { 4, "manual" }, { 5, "A-DEP" }, EXIF_TEXT_LIST_END};static ExifTextList CanonSet1FlashFired[] = { { 0, "no" }, { 1, "yes" }, EXIF_TEXT_LIST_END};static ExifTextList CanonSet1FocusCont[] = { { 0, "no (single)" }, { 1, "yes" }, EXIF_TEXT_LIST_END};static ExifMarker CanonSet1[] = {/* 0 is length of array in bytes (2 x array size) */{ 1, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.MacroMode", "Macro mode", CanonSet1MacroMode },{ 2, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.SelfTimer", "Self timer (10ths of second)", NULL },{ 3, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.Quality", "Quality", CanonSet1Quality },{ 4, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FlashMode", "Flash mode", CanonSet1FlashMode },{ 5, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.DriveMode", "Drive mode", CanonSet1DriveMode },{ 7, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FocusMode", "Focus mode", CanonSet1FocusMode },{ 10, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.ImageSize", "Image size", CanonSet1ImageSize },{ 11, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.ShootingMode","Shooting mode", CanonSet1ShootingMode }, { 11, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ExposureProgram", "ExposureProgram", CanonSet1ShootingMode },{ 12, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.DigitalZoom", "Digital zoom", CanonSet1DigitalZoom },{ 13, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.Contrast", "Contrast", CanonSet1ConSatSharp },{ 14, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.Saturation", "Saturation", CanonSet1ConSatSharp },{ 15, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.Sharpness", "Sharpness", CanonSet1ConSatSharp },{ 16, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.ISOSpeed", "ISO speed", CanonSet1ISOSpeed }, { 16, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ISOSpeedRatings", "ISO speed", CanonSet1ISOSpeed },{ 17, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.MeteringMode","Metering mode", CanonSet1MeteringMode },{ 18, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FocusType", "Focus type", CanonSet1FocusType },{ 19, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.AutoFocus", "AutoFocus point", CanonSet1AutoFocusPoint },{ 20, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.ExposureMode","Exposure mode", CanonSet1ExposureMode }, { 20, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ExposureMode", "Exposure mode", CanonSet1ExposureMode },{ 23, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FocalLengthLong","Long focal length", NULL },{ 24, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FocalLengthShort","Short focal length", NULL },{ 25, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FocalLengthUnits","Focal units per mm", NULL },{ 28, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FlashFired", "Flash fired", CanonSet1FlashFired },{ 29, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FlashDetails","Flash details", NULL },{ 32, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.ContinuousFocus","Continuous focus", CanonSet1FocusCont },EXIF_MARKER_LIST_END};static ExifTextList CanonSet2WhiteBalance[] = { { 0, "auto" }, { 1, "sunny" }, { 2, "cloudy" }, { 3, "tungsten" }, { 4, "fluorescent" }, { 5, "flash" }, { 6, "custom" }, { 7, "black and white" }, { 8, "shade" }, { 9, "manual" }, { 14, "daylight fluorescent" }, { 17, "underwater" }, EXIF_TEXT_LIST_END};static ExifTextList CanonSet2FlashBias[] = { { 0x0000, "0" }, { 0x000c, "0.33" }, { 0x0010, "0.5" }, { 0x0014, "0.67" }, { 0x0020, "1" }, { 0x002c, "1.33" }, { 0x0030, "1.5" }, { 0x0034, "1.67" }, { 0x0040, "2" }, { 0xffc0, "-2" }, { 0xffcc, "-1.67" }, { 0xffd0, "-1.5" }, { 0xffd4, "-1.33" }, { 0xffe0, "-1" }, { 0xffec, "-0.67" }, { 0xfff0, "-0.5" }, { 0xfff4, "-0.33" }, EXIF_TEXT_LIST_END};static ExifMarker CanonSet2[] = {/* 0 is length of array in bytes (2 x array size) */{ 7, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.WhiteBalance","White balance", CanonSet2WhiteBalance }, { 7, EXIF_FORMAT_SHORT_UNSIGNED, 1, "LightSource", "White balance", CanonSet2WhiteBalance },{ 9, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.SequenceNumber","Sequence number", NULL },{ 15, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FlashBias", "Flash bias", CanonSet2FlashBias },/* distance needs more than just this (metric) value */{ 19, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.SubjectDistance", "Subject Distance", NULL },EXIF_MARKER_LIST_END};#if 0static ExifTextList CanonCustomEnable[] = { { 0, "off" }, { 1, "on" }, EXIF_TEXT_LIST_END};static ExifTextList CanonCustomEnableInvert[] = { { 0, "on" }, { 1, "off" }, EXIF_TEXT_LIST_END};static ExifTextList CanonCustomExposureLevel[] = { { 0, "1/2 stop" }, { 1, "1/3 stop" }, EXIF_TEXT_LIST_END};static ExifTextList CanonCustomAVShutterSpeed[] = { { 0, "auto" }, { 1, "1/200 (fixed)" }, EXIF_TEXT_LIST_END};static ExifTextList CanonCustomShutterCurtainSync[] = { { 0, "1st" }, { 1, "2nd" }, EXIF_TEXT_LIST_END};static ExifMarker CanonCustom[] = {{ 1, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.NoiseReduction", "Noise reduction", CanonCustomEnable },/*{ 2, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.BtnFuncShutter", "Shutter/Auto exposure button function",CanonCustomBTNShutter }, */{ 3, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.MirrorLockup", "Mirror lockup", CanonCustomEnable },{ 4, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.TvAvExposureLevel", "Tv/Av and exposure level", CanonCustomExposureLevel },{ 5, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.AFAssistLight", "AF assist light", CanonCustomEnableInvert },{ 6, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.AvShutterSpeed", "Shutter speed in Av mode", CanonCustomAVShutterSpeed },/*{ 7, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.AutoBracket", "Auto-Exposure bracketting sequence/auto cancellation", CanonCustom }, */{ 8, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.ShutterSync", "Shutter sync", CanonCustomShutterCurtainSync },/* { 9, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.BtnFuncAF", "AF button function", CanonCustom }, */{ 10, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.FillFlashReduction", "Fill flash auto reduction", CanonCustomEnableInvert },/*{ 11, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.BtnFuncMenu", "Menu button function", CanonCustom }, *//*{ 12, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.BtnFuncSet", "Set button function", CanonCustom }, */{ 13, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Canon.SensorCleaning", "Sensor cleaning", CanonCustomEnable },EXIF_MARKER_LIST_END};#endifstatic ExifMarker CanonExifMarkersList[] = { { 1, EXIF_FORMAT_SHORT_UNSIGNED, -1, "MkN.Canon.Settings1", NULL, NULL }, { 4, EXIF_FORMAT_SHORT_UNSIGNED, -1, "MkN.Canon.Settings2", NULL, NULL }, { 6, EXIF_FORMAT_STRING, -1, "MkN.Canon.ImageType", "Image type", NULL }, { 7, EXIF_FORMAT_STRING, -1, "MkN.Canon.FirmwareVersion", "Firmware version", NULL }, { 8, EXIF_FORMAT_LONG_UNSIGNED, 1, "MkN.Canon.ImageNumber", "Image number", NULL }, { 9, EXIF_FORMAT_STRING, -1, "MkN.Canon.OwnerName", "Owner name", NULL }, { 12, EXIF_FORMAT_LONG_UNSIGNED, -1, "MkN.Canon.SerialNumber", "Camera serial number", NULL }, { 15, EXIF_FORMAT_SHORT_UNSIGNED, -1, "MkN.Canon.CustomFunctions", NULL, NULL }, EXIF_MARKER_LIST_END};static void canon_mknote_parse_settings(ExifData *exif, guint16 *data, guint32 len, ExifByteOrder bo, ExifMarker *list){ gint i; i = 0; while (list[i].tag != 0) { if (list[i].tag < len) { ExifItem *item; item = exif_item_new(EXIF_FORMAT_SHORT_UNSIGNED, list[i].tag, 1, &list[i]); exif_item_copy_data(item, &data[list[i].tag], 2, EXIF_FORMAT_SHORT_UNSIGNED, bo); exif->items = g_list_prepend(exif->items, item); } i++; }}#if 0static void canon_mknote_parse_convert(ExifData *exif){ gint value; ExifItem *result; /* seems we need more than only this value for distance */ if (exif_get_integer(exif, "MkN.Canon.SubjectDistance", &value)) { static ExifMarker marker= { 0x9206, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "SubjectDistance", "Subject distance", NULL }; ExifItem *item; ExifRational *rational; item = exif_item_new(marker.format, marker.tag, 1, &marker); rational = item->data; rational->num = value; rational->den = 100; exif->items = g_list_prepend(exif->items, item); } result = exif_get_item(exif, "MkN.Canon.SerialNumber"); if (result && result->format == EXIF_FORMAT_LONG_UNSIGNED && result->data_len == 4) { static ExifMarker marker= { 12, EXIF_FORMAT_STRING, -1, "SerialNumber", "Camera serial number", NULL }; ExifItem *item; gchar *text; gint l; guint32 n; n = (guint32)((guint32 *)(result->data))[0]; text = g_strdup_printf("%04X%05d", n & 0xffff0000 >> 8, n & 0x0000ffff); l = strlen(text) + 1; item = exif_item_new(marker.format, marker.tag, l, &marker); memcpy(item->data, text, l); g_free(text); exif->items = g_list_prepend(exif->items, item); }}#endifgint format_canon_makernote(ExifData *exif, unsigned char *tiff, guint offset, guint size, ExifByteOrder bo){ ExifItem *item; if (exif_parse_IFD_table(exif, tiff, offset, size, bo, 0, CanonExifMarkersList) != 0) { return FALSE; } item = exif_get_item(exif, "MkN.Canon.Settings1"); if (item) { canon_mknote_parse_settings(exif, item->data, item->data_len, bo, CanonSet1); } item = exif_get_item(exif, "MkN.Canon.Settings2"); if (item) { canon_mknote_parse_settings(exif, item->data, item->data_len, bo, CanonSet2); }#if 0 canon_mknote_parse_convert(exif);#endif return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -