📄 exif.c
字号:
};static tag_info_array tag_table_VND_CASIO = { { 0x0001, "RecordingMode"}, { 0x0002, "Quality"}, { 0x0003, "FocusingMode"}, { 0x0004, "FlashMode"}, { 0x0005, "FlashIntensity"}, { 0x0006, "ObjectDistance"}, { 0x0007, "WhiteBalance"}, { 0x000A, "DigitalZoom"}, { 0x000B, "Sharpness"}, { 0x000C, "Contrast"}, { 0x000D, "Saturation"}, { 0x0014, "CCDSensitivity"}, TAG_TABLE_END};static tag_info_array tag_table_VND_FUJI = { { 0x0000, "Version"}, { 0x1000, "Quality"}, { 0x1001, "Sharpness"}, { 0x1002, "WhiteBalance"}, { 0x1003, "Color"}, { 0x1004, "Tone"}, { 0x1010, "FlashMode"}, { 0x1011, "FlashStrength"}, { 0x1020, "Macro"}, { 0x1021, "FocusMode"}, { 0x1030, "SlowSync"}, { 0x1031, "PictureMode"}, { 0x1100, "ContTake"}, { 0x1300, "BlurWarning"}, { 0x1301, "FocusWarning"}, { 0x1302, "AEWarning "}, TAG_TABLE_END};static tag_info_array tag_table_VND_NIKON = { { 0x0003, "Quality"}, { 0x0004, "ColorMode"}, { 0x0005, "ImageAdjustment"}, { 0x0006, "CCDSensitivity"}, { 0x0007, "WhiteBalance"}, { 0x0008, "Focus"}, { 0x000a, "DigitalZoom"}, { 0x000b, "Converter"}, TAG_TABLE_END}; static tag_info_array tag_table_VND_NIKON_990 = { { 0x0001, "Version"}, { 0x0002, "ISOSetting"}, { 0x0003, "ColorMode"}, { 0x0004, "Quality"}, { 0x0005, "WhiteBalance"}, { 0x0006, "ImageSharpening"}, { 0x0007, "FocusMode"}, { 0x0008, "FlashSetting"}, { 0x000F, "ISOSelection"}, { 0x0080, "ImageAdjustment"}, { 0x0082, "AuxiliaryLens"}, { 0x0085, "ManualFocusDistance"}, { 0x0086, "DigitalZoom"}, { 0x0088, "AFFocusPosition"}, { 0x0010, "DataDump"}, TAG_TABLE_END}; static tag_info_array tag_table_VND_OLYMPUS = { { 0x0200, "SpecialMode"}, { 0x0201, "JPEGQuality"}, { 0x0202, "Macro"}, { 0x0204, "DigitalZoom"}, { 0x0207, "SoftwareRelease"}, { 0x0208, "PictureInfo"}, { 0x0209, "CameraId"}, { 0x0F00, "DataDump"}, TAG_TABLE_END};typedef enum mn_byte_order_t { MN_ORDER_INTEL = 0, MN_ORDER_MOTOROLA = 1, MN_ORDER_NORMAL} mn_byte_order_t;typedef enum mn_offset_mode_t { MN_OFFSET_NORMAL, MN_OFFSET_MAKER, MN_OFFSET_GUESS} mn_offset_mode_t;typedef struct { tag_table_type tag_table; char * make; char * model; char * id_string; int id_string_len; int offset; mn_byte_order_t byte_order; mn_offset_mode_t offset_mode;} maker_note_type;static const maker_note_type maker_note_array[] = { { tag_table_VND_CANON, "Canon", NULL, NULL, 0, 0, MN_ORDER_INTEL, MN_OFFSET_GUESS},/* { tag_table_VND_CANON, "Canon", NULL, NULL, 0, 0, MN_ORDER_NORMAL, MN_OFFSET_NORMAL},*/ { tag_table_VND_CASIO, "CASIO", NULL, NULL, 0, 0, MN_ORDER_MOTOROLA, MN_OFFSET_NORMAL}, { tag_table_VND_FUJI, "FUJIFILM", NULL, "FUJIFILM\x0C\x00\x00\x00", 12, 12, MN_ORDER_INTEL, MN_OFFSET_MAKER}, { tag_table_VND_NIKON, "NIKON", NULL, "Nikon\x00\x01\x00", 8, 8, MN_ORDER_NORMAL, MN_OFFSET_NORMAL}, { tag_table_VND_NIKON_990, "NIKON", NULL, NULL, 0, 0, MN_ORDER_NORMAL, MN_OFFSET_NORMAL}, { tag_table_VND_OLYMPUS, "OLYMPUS OPTICAL CO.,LTD", NULL, "OLYMP\x00\x01\x00", 8, 8, MN_ORDER_NORMAL, MN_OFFSET_NORMAL},};/* }}} *//* {{{ exif_get_tagname Get headername for tag_num or NULL if not defined */static char * exif_get_tagname(int tag_num, char *ret, int len, tag_table_type tag_table TSRMLS_DC){ int i, t; char tmp[32]; for (i=0;;i++) { if ((t=tag_table[i].Tag) == tag_num || t==TAG_END_OF_LIST) { if (t==TAG_END_OF_LIST) { break; } if (ret && len) { strncpy(ret, tag_table[i].Desc, abs(len)); if (len<0) { len = -len; ret[len-1]='\0'; for(i=strlen(ret);i<len;i++)ret[i]=' '; } ret[len-1]='\0'; return ret; } return tag_table[i].Desc; } } if (ret && len) { snprintf(tmp, sizeof(tmp), "UndefinedTag:0x%04X", tag_num); strncpy(ret, tmp, abs(len)); if (len<0) { len = -len; ret[len-1]='\0'; for(i=strlen(ret);i<len;i++)ret[i]=' '; } ret[len-1]='\0'; return ret; } return "";}/* }}} *//* {{{ exif_char_dump * Do not use! This is a debug function... */#ifdef EXIF_DEBUGstatic unsigned char* exif_char_dump(unsigned char * addr, int len, int offset){ static unsigned char buf[4096+1]; static unsigned char tmp[20]; int c, i, p=0, n = 5+31; p += sprintf(buf+p, "\nDump Len: %08X (%d)", len, len); if (len) { for(i=0; i<len+15 && p+n<=sizeof(buf); i++) { if (i%16==0) { p += sprintf(buf+p, "\n%08X: ", i+offset); } if (i<len) { c = *addr++; p += sprintf(buf+p, "%02X ", c); tmp[i%16] = c>=32 ? c : '.'; tmp[(i%16)+1] = '\0'; } else { p += sprintf(buf+p, " "); } if (i%16==15) { p += sprintf(buf+p, " %s", tmp); if (i>=len) { break; } } } } buf[sizeof(buf)-1] = '\0'; return buf;}#endif/* }}} *//* {{{ php_jpg_get16 Get 16 bits motorola order (always) for jpeg header stuff.*/static int php_jpg_get16(void *value){ return (((uchar *)value)[0] << 8) | ((uchar *)value)[1];}/* }}} *//* {{{ php_ifd_get16u * Convert a 16 bit unsigned value from file's native byte order */static int php_ifd_get16u(void *value, int motorola_intel){ if (motorola_intel) { return (((uchar *)value)[0] << 8) | ((uchar *)value)[1]; } else { return (((uchar *)value)[1] << 8) | ((uchar *)value)[0]; }}/* }}} *//* {{{ php_ifd_get16s * Convert a 16 bit signed value from file's native byte order */static signed short php_ifd_get16s(void *value, int motorola_intel){ return (signed short)php_ifd_get16u(value, motorola_intel);}/* }}} *//* {{{ php_ifd_get32s * Convert a 32 bit signed value from file's native byte order */static int php_ifd_get32s(void *value, int motorola_intel){ if (motorola_intel) { return (((char *)value)[0] << 24) | (((uchar *)value)[1] << 16) | (((uchar *)value)[2] << 8 ) | (((uchar *)value)[3] ); } else { return (((char *)value)[3] << 24) | (((uchar *)value)[2] << 16) | (((uchar *)value)[1] << 8 ) | (((uchar *)value)[0] ); }}/* }}} *//* {{{ php_ifd_get32u * Write 32 bit unsigned value to data */static unsigned php_ifd_get32u(void *value, int motorola_intel){ return (unsigned)php_ifd_get32s(value, motorola_intel) & 0xffffffff;}/* }}} *//* {{{ php_ifd_set16u * Write 16 bit unsigned value to data */static void php_ifd_set16u(char *data, unsigned int value, int motorola_intel){ if (motorola_intel) { data[0] = (value & 0xFF00) >> 8; data[1] = (value & 0x00FF); } else { data[1] = (value & 0xFF00) >> 8; data[0] = (value & 0x00FF); }}/* }}} *//* {{{ php_ifd_set32u * Convert a 32 bit unsigned value from file's native byte order */static void php_ifd_set32u(char *data, size_t value, int motorola_intel){ if (motorola_intel) { data[0] = (value & 0xFF000000) >> 24; data[1] = (value & 0x00FF0000) >> 16; data[2] = (value & 0x0000FF00) >> 8; data[3] = (value & 0x000000FF); } else { data[3] = (value & 0xFF000000) >> 24; data[2] = (value & 0x00FF0000) >> 16; data[1] = (value & 0x0000FF00) >> 8; data[0] = (value & 0x000000FF); }}/* }}} *//* {{{ exif_convert_any_format * Evaluate number, be it int, rational, or float from directory. */static double exif_convert_any_format(void *value, int format, int motorola_intel TSRMLS_DC){ int s_den; unsigned u_den; switch(format) { case TAG_FMT_SBYTE: return *(signed char *)value; case TAG_FMT_BYTE: return *(uchar *)value; case TAG_FMT_USHORT: return php_ifd_get16u(value, motorola_intel); case TAG_FMT_ULONG: return php_ifd_get32u(value, motorola_intel); case TAG_FMT_URATIONAL: u_den = php_ifd_get32u(4+(char *)value, motorola_intel); if (u_den == 0) { return 0; } else { return (double)php_ifd_get32u(value, motorola_intel) / u_den; } case TAG_FMT_SRATIONAL: s_den = php_ifd_get32s(4+(char *)value, motorola_intel); if (s_den == 0) { return 0; } else { return (double)php_ifd_get32s(value, motorola_intel) / s_den; } case TAG_FMT_SSHORT: return (signed short)php_ifd_get16u(value, motorola_intel); case TAG_FMT_SLONG: return php_ifd_get32s(value, motorola_intel); /* Not sure if this is correct (never seen float used in Exif format) */ case TAG_FMT_SINGLE:#ifdef EXIF_DEBUG php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found value of type single");#endif return (double)*(float *)value; case TAG_FMT_DOUBLE:#ifdef EXIF_DEBUG php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found value of type double");#endif return *(double *)value; } return 0;}/* }}} *//* {{{ exif_convert_any_to_int * Evaluate number, be it int, rational, or float from directory. */static size_t exif_convert_any_to_int(void *value, int format, int motorola_intel TSRMLS_DC){ int s_den; unsigned u_den; switch(format) { case TAG_FMT_SBYTE: return *(signed char *)value; case TAG_FMT_BYTE: return *(uchar *)value; case TAG_FMT_USHORT: return php_ifd_get16u(value, motorola_intel); case TAG_FMT_ULONG: return php_ifd_get32u(value, motorola_intel); case TAG_FMT_URATIONAL: u_den = php_ifd_get32u(4+(char *)value, motorola_intel); if (u_den == 0) { return 0; } else { return php_ifd_get32u(value, motorola_intel) / u_den; } case TAG_FMT_SRATIONAL: s_den = php_ifd_get32s(4+(char *)value, motorola_intel); if (s_den == 0) { return 0; } else { return php_ifd_get32s(value, motorola_intel) / s_den; } case TAG_FMT_SSHORT: return php_ifd_get16u(value, motorola_intel); case TAG_FMT_SLONG: return php_ifd_get32s(value, motorola_intel); /* Not sure if this is correct (never seen float used in Exif format) */ case TAG_FMT_SINGLE:#ifdef EXIF_DEBUG php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found value of type single");#endif return (size_t)*(float *)value; case TAG_FMT_DOUBLE:#ifdef EXIF_DEBUG php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found value of type double");#endif return (size_t)*(double *)value; } return 0;}/* }}} *//* {{{ struct image_info_value, image_info_list*/#ifndef WORD#define WORD unsigned short#endif#ifndef DWORD#define DWORD unsigned int#endiftypedef struct { int num; int den;} signed_rational;typedef struct { unsigned int num; unsigned int den;} unsigned_rational;typedef union _image_info_value { char *s; unsigned u; int i; float f; double d; signed_rational sr; unsigned_rational ur; union _image_info_value *list;} image_info_value;typedef struct { WORD tag; WORD format; DWORD length; DWORD dummy; /* value ptr of tiff directory entry */ char *name; image_info_value value;} image_info_data;typedef struct {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -