亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? exif.c

?? Gqview,Linux下基于GTK+庫寫成的輕量級而能豐富的圖像瀏覽程序。
?? C
?? 第 1 頁 / 共 3 頁
字號:
				}			}		else			{			spacer = "";			}		g_string_append_printf(string, "%s%02x", spacer, ((char *)data)[i]);		}	if (i >= UNDEFINED_TEXT_BYTE_COUNT) g_string_append_printf(string, " (%d bytes)", ne);	return string;}gchar *exif_text_list_find_value(ExifTextList *list, guint value){	gchar *result = NULL;	gint i;	i = 0;	while (!result && list[i].value >= 0)		{		if (value == list[i].value) result = g_strdup(_(list[i].description));		i++;		}	if (!result) result = g_strdup_printf("%d (%s)", value, _("unknown"));	return result;}/* *------------------------------------------------------------------- * byte size utils *------------------------------------------------------------------- */guint16 exif_byte_get_int16(unsigned char *f, ExifByteOrder bo){	if (bo == EXIF_BYTE_ORDER_INTEL)		return GUINT16_FROM_LE(*(guint16*)f);	else		return GUINT16_FROM_BE(*(guint16*)f);}guint32 exif_byte_get_int32(unsigned char *f, ExifByteOrder bo){	if (bo == EXIF_BYTE_ORDER_INTEL)		return GUINT32_FROM_LE(*(guint32*)f);	else		return GUINT32_FROM_BE(*(guint32*)f);}guint16 exif_byte_swab_int16(guint16 n, ExifByteOrder bo){#if G_BYTE_ORDER == G_LITTLE_ENDIAN	if (bo == EXIF_BYTE_ORDER_MOTOROLA)#else	if (bo == EXIF_BYTE_ORDER_INTEL)#endif		return GUINT16_SWAP_LE_BE(n);	else		return n;}guint32 exif_byte_swab_int32(guint32 n, ExifByteOrder bo){#if G_BYTE_ORDER == G_LITTLE_ENDIAN	if (bo == EXIF_BYTE_ORDER_MOTOROLA)#else	if (bo == EXIF_BYTE_ORDER_INTEL)#endif		return GUINT32_SWAP_LE_BE(n);	else		return n;}/* *------------------------------------------------------------------- * IFD utils *------------------------------------------------------------------- */static const ExifMarker *exif_marker_from_tag(guint16 tag, const ExifMarker *list){	gint i = 0;	if (!list) return NULL;	while (list[i].tag != 0 && list[i].tag != tag)		{		i++;		}	return (list[i].tag == 0 ? NULL : &list[i]);}static void rational_from_data(ExifRational *r, void *src, ExifByteOrder bo){	r->num = exif_byte_get_int32(src, bo);	r->den = exif_byte_get_int32(src + sizeof(guint32), bo);}/* src_format and item->format must be compatible * and not overrun src or item->data. */void exif_item_copy_data(ExifItem *item, void *src, guint len,			 ExifFormatType src_format, ExifByteOrder bo){	gint bs;	gint ne;	gpointer dest;	gint i;	bs = ExifFormatList[item->format].size;	ne = item->elements;	dest = item->data;	if (!dest ||	    ExifFormatList[src_format].size * ne > len)		{		printf("exif tag %s data size mismatch\n", exif_item_get_tag_name(item));		return;		}	switch (item->format)		{		case EXIF_FORMAT_UNKNOWN:			break;		case EXIF_FORMAT_BYTE_UNSIGNED:		case EXIF_FORMAT_BYTE:		case EXIF_FORMAT_UNDEFINED:			memcpy(dest, src, len);			break;		case EXIF_FORMAT_STRING:			memcpy(dest, src, len);			/* string is NULL terminated, make sure this is true */			if (((char *)dest)[len - 1] != '\0') ((char *)dest)[len - 1] = '\0';			break;		case EXIF_FORMAT_SHORT_UNSIGNED:		case EXIF_FORMAT_SHORT:			for (i = 0; i < ne; i++)				{				((guint16 *)dest)[i] = exif_byte_get_int16(src + i * bs, bo);				}			break;		case EXIF_FORMAT_LONG_UNSIGNED:		case EXIF_FORMAT_LONG:			if (src_format == EXIF_FORMAT_SHORT_UNSIGNED ||			    src_format == EXIF_FORMAT_SHORT)				{				/* a short fits into a long, so allow it */				gint ss;				ss = ExifFormatList[src_format].size;				for (i = 0; i < ne; i++)					{					((gint32 *)dest)[i] =						(gint32)exif_byte_get_int16(src + i * ss, bo);					}				}			else				{				for (i = 0; i < ne; i++)					{					((gint32 *)dest)[i] =						exif_byte_get_int32(src + i * bs, bo);					}				}			break;		case EXIF_FORMAT_RATIONAL_UNSIGNED:		case EXIF_FORMAT_RATIONAL:			for (i = 0; i < ne; i++)				{				rational_from_data(&((ExifRational *)dest)[i], src + i * bs, bo);				}			break;		case EXIF_FORMAT_FLOAT:			for (i = 0; i < ne; i++)				{				((float *)dest)[i] = exif_byte_get_int32(src + i * bs, bo);				}			break;		case EXIF_FORMAT_DOUBLE:			for (i = 0; i < ne; i++)				{				ExifRational r;				rational_from_data(&r, src + i * bs, bo);				if (r.den) ((double *)dest)[i] = (double)r.num / r.den;				}			break;		}}static gint exif_parse_IFD_entry(ExifData *exif, unsigned char *tiff, guint offset,				 guint size, ExifByteOrder bo,				 gint level,				 const ExifMarker *list){	guint tag;	guint format;	guint count;	guint data_val;	guint data_offset;	guint data_length;	const ExifMarker *marker;	ExifItem *item;	tag = exif_byte_get_int16(tiff + offset + EXIF_TIFD_OFFSET_TAG, bo);	format = exif_byte_get_int16(tiff + offset + EXIF_TIFD_OFFSET_FORMAT, bo);	count = exif_byte_get_int32(tiff + offset + EXIF_TIFD_OFFSET_COUNT, bo);	data_val = exif_byte_get_int32(tiff + offset + EXIF_TIFD_OFFSET_DATA, bo);	/* Check tag type. If it does not match, either the format is wrong,	 * either it is a unknown tag; so it is not really an error.	 */	marker = exif_marker_from_tag(tag, list);	if (!marker)		{		if (format >= EXIF_FORMAT_COUNT)			{			printf("warning: exif tag 0x%4x has invalid format %d\n", tag, format);			return 0;			}		/* allow non recognized tags to be displayed */		marker = &ExifUnknownMarkersList[format];		}	if (marker->format != format)		{		/* Some cameras got mixed up signed/unsigned_rational		 * eg KODAK DC4800 on object_distance tag		 *		 * FIXME: what exactly is this test trying to do?		 * ok, so this test is to allow the case of swapped signed/unsigned mismatch to leak through?		 */		if (!(marker->format == EXIF_FORMAT_RATIONAL_UNSIGNED && format == EXIF_FORMAT_RATIONAL) &&		    !(marker->format == EXIF_FORMAT_RATIONAL && format == EXIF_FORMAT_RATIONAL_UNSIGNED) &&			/* short fits into a long so allow this mismatch			 * as well (some tags allowed to be unsigned short _or_ unsigned long)			 */		    !(marker->format == EXIF_FORMAT_LONG_UNSIGNED && format == EXIF_FORMAT_SHORT_UNSIGNED) )			{			if (format < EXIF_FORMAT_COUNT)				{				printf("warning: exif tag %s format mismatch, found %s exif spec requests %s\n",					marker->key, ExifFormatList[format].short_name,					ExifFormatList[marker->format].short_name);				}			else				{				printf("warning: exif tag %s format mismatch, found unknown id %d exif spec requests %d (%s)\n",					marker->key, format, marker->format,					ExifFormatList[marker->format].short_name);				}			return 0;			}		}	/* Where is the data, is it available?	 */	if (marker->components > 0 && marker->components != count)		{		printf("warning: exif tag %s has %d elements, exif spec requests %d\n",			marker->key, count, marker->components);		}	data_length = ExifFormatList[marker->format].size * count;	if (data_length > 4)		{		data_offset = data_val;		if (size < data_offset + data_length)			{			printf("warning: exif tag %s data will overrun end of file, ignored.\n", marker->key);			return -1;			}		}	else		{		data_offset = offset + EXIF_TIFD_OFFSET_DATA;		}	item = exif_item_new(marker->format, tag, count, marker);	exif_item_copy_data(item, tiff + data_offset, data_length, format, bo);	exif->items = g_list_prepend(exif->items, item);	if (list == ExifKnownMarkersList)		{		switch (item->tag)			{			case TAG_EXIFOFFSET:				exif_parse_IFD_table(exif, tiff, data_val, size, bo, level + 1, list);				break;			case TAG_EXIFMAKERNOTE:				format_exif_makernote_parse(exif, tiff, data_val, size, bo);				break;			}		}	return 0;}gint exif_parse_IFD_table(ExifData *exif,			  unsigned char *tiff, guint offset,			  guint size, ExifByteOrder bo,			  gint level,			  const ExifMarker *list){	guint count;	guint i;	/* limit damage from infinite loops */	if (level > EXIF_TIFF_MAX_LEVELS) return -1;	/* We should be able to read number of entries in IFD0) */	if (size < offset + 2) return -1;	count = exif_byte_get_int16(tiff + offset, bo);	offset += 2;	/* Entries and next IFD offset must be readable */	if (size < offset + count * EXIF_TIFD_SIZE + 4) return -1;	for (i = 0; i < count; i++)		{		exif_parse_IFD_entry(exif, tiff, offset + i * EXIF_TIFD_SIZE, size, bo, level, list);		}	return 0;}/* *------------------------------------------------------------------- * file formats *------------------------------------------------------------------- */gint exif_tiff_directory_offset(unsigned char *data, const guint len,				guint *offset, ExifByteOrder *bo){	if (len < 8) return FALSE;	if (memcmp(data, "II", 2) == 0)		{		*bo = EXIF_BYTE_ORDER_INTEL;		}	else if (memcmp(data, "MM", 2) == 0)		{		*bo = EXIF_BYTE_ORDER_MOTOROLA;		}	else		{		return FALSE;		}	if (exif_byte_get_int16(data + 2, *bo) != 0x002A)		{		return FALSE;		}	*offset = exif_byte_get_int32(data + 4, *bo);	return (*offset < len);}gint exif_tiff_parse(ExifData *exif, unsigned char *tiff, guint size, ExifMarker *list){	ExifByteOrder bo;	guint offset;	if (!exif_tiff_directory_offset(tiff, size, &offset, &bo)) return -1;	return exif_parse_IFD_table(exif, tiff, offset, size, bo, 0, list);}/* *------------------------------------------------------------------- * jpeg marker utils *------------------------------------------------------------------- */#define MARKER_UNKNOWN		0x00#define MARKER_SOI		0xD8#define MARKER_APP1		0xE1static gint jpeg_get_marker_size(unsigned char *data){	/* Size is always in Motorola byte order */	return exif_byte_get_int16(data + 2, EXIF_BYTE_ORDER_MOTOROLA);}static gint jpeg_goto_next_marker(unsigned char **data, gint *size, gint *marker){	gint marker_size = 2;	*marker = MARKER_UNKNOWN;	/* It is safe to access the marker and its size since we have checked	 * the SOI and this function guaranties the whole next marker is	 * available	 */	if (*(*data + 1) != MARKER_SOI)		{		marker_size += jpeg_get_marker_size(*data);		}	*size -= marker_size;	/* size should be at least 4, so we can read the marker and its size	 * and check data are actually available	 */	if (*size < 4) return -1;	/* Jump to the next marker and be sure it begins with 0xFF	 */	*data += marker_size;	if (**data != 0xFF) return -1;	if (jpeg_get_marker_size(*data) + 2 > *size) return -1;	*marker = *(*data + 1);	return 0;}static gint exif_parse_JPEG(ExifData *exif, unsigned char *data, guint size, ExifMarker *list){	guint marker;	guint marker_size;	if (size < 4 || *data != 0xFF || *(data + 1) != MARKER_SOI)		{		return -2;		}	do {		if (jpeg_goto_next_marker(&data, &size, &marker) == -1)			{			break;			}	} while (marker != MARKER_APP1);	if (marker != MARKER_APP1)		{		return -2;		}	marker_size = jpeg_get_marker_size(data) - 2;			if (marker_size < 6 || memcmp(data + 4, "Exif\x00\x00", 6) != 0)		{		return -2;		}	return exif_tiff_parse(exif, data + 10, marker_size - 6, list);}/* *------------------------------------------------------------------- * misc *------------------------------------------------------------------- */static gint map_file(const gchar *path, void **mapping, int *size){	int fd;	struct stat fs;	if ((fd = open(path, O_RDONLY)) == -1)		{		perror(path);		return -1;		}	if (fstat(fd, &fs) == -1)		{		perror(path);		close(fd);		return -1;		}	*size = fs.st_size;	if ((*mapping = mmap(0, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0)) == MAP_FAILED)		{		perror(path);		close(fd);		return -1;		}	close(fd);	return 0;}static gint unmap_file(void *mapping, int size){	if (munmap(mapping, size) == -1)		{		perror("munmap");		return -1;		}	return 0;}void exif_free(ExifData *exif){	GList *work;	if (!exif) return;	work = exif->items;	while (work)		{		ExifItem *item = work->data;		work = work->next;		exif_item_free(item);		}	g_list_free(exif->items);	g_free(exif);}ExifData *exif_read(const gchar *path){	ExifData *exif;	void *f;	int size, res;	gchar *pathl;	if (!path) return NULL;	pathl = path_from_utf8(path);	if (map_file(pathl, &f, &size) == -1)		{		g_free(pathl);		return NULL;		}	g_free(pathl);	exif = g_new0(ExifData, 1);	exif->items = NULL;	if ((res = exif_parse_JPEG(exif, (unsigned char *)f, size, ExifKnownMarkersList)) == -2)		{		res = exif_tiff_parse(exif, (unsigned char *)f, size, ExifKnownMarkersList);		}	if (res != 0)		{		guint32 offset = 0;		

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
9i在线看片成人免费| 亚洲亚洲人成综合网络| 国产区在线观看成人精品| 精品国产百合女同互慰| 国产精品日产欧美久久久久| 亚洲欧美激情视频在线观看一区二区三区 | 日韩视频一区在线观看| 国产情人综合久久777777| 亚洲网友自拍偷拍| 91网址在线看| 精品免费一区二区三区| 亚洲二区视频在线| 99久久精品国产一区| 日韩三级.com| 久久久国产精品不卡| 三级欧美在线一区| 99热这里都是精品| 国产精品色呦呦| 国产一区二区在线观看视频| 在线观看91视频| 亚洲欧洲韩国日本视频| 激情久久五月天| 国产999精品久久久久久| 2021中文字幕一区亚洲| 亚洲国产成人porn| 日本韩国欧美国产| 亚洲丝袜制服诱惑| 国产精品资源网| 日韩欧美一级二级| 美女性感视频久久| 在线视频观看一区| 国产精品无码永久免费888| 丝袜国产日韩另类美女| 不卡av免费在线观看| 精品国免费一区二区三区| 国产精品久99| 国内精品自线一区二区三区视频| 国产一区91精品张津瑜| 日韩一区和二区| 日本不卡免费在线视频| 精品视频一区三区九区| 亚洲精品网站在线观看| 91视频免费播放| 亚洲精品国产无天堂网2021 | 亚洲综合激情网| av在线一区二区| 国产精品视频一二三区| 国产成人丝袜美腿| 久久新电视剧免费观看| 激情五月激情综合网| 精品毛片乱码1区2区3区| 亚洲bt欧美bt精品| 日韩欧美一级在线播放| 久久电影网电视剧免费观看| 91精品一区二区三区久久久久久 | 精品免费国产一区二区三区四区| 热久久久久久久| 日韩欧美一区在线| 麻豆91免费观看| 久久综合九色综合97婷婷女人| 国产一区二区三区最好精华液| 久久久精品中文字幕麻豆发布| 国产一区不卡在线| 国产精品福利一区二区三区| 岛国一区二区三区| 国产精品乱码一区二区三区软件| 成人黄动漫网站免费app| 亚洲黄色尤物视频| 91精品国产入口在线| 久久成人综合网| 国产精品乱人伦一区二区| 在线观看国产一区二区| 青青草91视频| 欧美电影免费观看高清完整版在线| 黄页网站大全一区二区| 欧美日韩三级视频| 久久99最新地址| 久久这里只有精品6| 91在线观看污| 国产欧美精品一区二区三区四区 | 日本va欧美va精品| 大胆亚洲人体视频| 欧美色涩在线第一页| 91在线精品一区二区| 中国av一区二区三区| 欧美精品xxxxbbbb| 加勒比av一区二区| 亚洲视频一区二区在线| 欧美日本一区二区| 99久久99久久免费精品蜜臀| 午夜视频在线观看一区二区| 国产日韩欧美一区二区三区乱码 | 精品无人码麻豆乱码1区2区| 日本一区二区三级电影在线观看 | 国产一区二区不卡| 亚洲区小说区图片区qvod| 欧美日本视频在线| 国产精品综合一区二区三区| 亚洲综合免费观看高清完整版在线| 欧美午夜不卡在线观看免费| 国产成人精品亚洲日本在线桃色| 一区二区三区在线观看视频 | 国产乱码精品一区二区三区五月婷| 日本一区二区三区免费乱视频| 99精品一区二区三区| 久久成人av少妇免费| 亚洲国产精品人人做人人爽| 日韩美女视频一区二区| 国产亚洲自拍一区| 日韩色在线观看| 91麻豆蜜桃一区二区三区| 中文字幕免费在线观看视频一区| 91女厕偷拍女厕偷拍高清| 国产黄色精品视频| 日韩黄色免费网站| 亚洲午夜在线视频| 亚洲免费视频成人| 国产午夜精品福利| 久久你懂得1024| 欧美videos中文字幕| 91精品国产综合久久蜜臀| 欧美猛男gaygay网站| 色视频成人在线观看免| 国产在线不卡一区| 国产很黄免费观看久久| 国产麻豆午夜三级精品| 国产精品电影一区二区| 国产性天天综合网| 国产亚洲精品资源在线26u| 欧美xingq一区二区| 欧美va在线播放| 欧美成人女星排名| 欧美成人性战久久| 国产亚洲精品bt天堂精选| 欧美一区二区三区四区久久| 制服丝袜日韩国产| 日韩欧美专区在线| 日韩欧美综合在线| 精品成人a区在线观看| 欧美成人r级一区二区三区| 欧美军同video69gay| 日韩一区二区高清| 久久亚洲一区二区三区四区| 日韩一区二区三区电影| 久久先锋影音av鲁色资源| 久久精品人人做| 久久久久88色偷偷免费| 亚洲国产精品二十页| 亚洲天堂久久久久久久| 久久免费午夜影院| 中文字幕国产精品一区二区| 综合久久国产九一剧情麻豆| 国产精品乱码人人做人人爱| 久久影音资源网| 欧美一区二区视频在线观看2020| 这里只有精品视频在线观看| 欧美一区二区三区免费| 欧美无人高清视频在线观看| 欧美精品色综合| 精品美女在线观看| 国产精品三级视频| 午夜视频一区二区三区| 老司机免费视频一区二区| 成人免费视频一区二区| 粉嫩av一区二区三区在线播放 | 911精品产国品一二三产区| 91精品国产aⅴ一区二区| 不卡av免费在线观看| 亚洲一区二区三区不卡国产欧美| 日本成人在线看| 日韩av二区在线播放| 久久成人久久爱| 色久综合一二码| 国产午夜久久久久| 亚洲一二三四区| 成人免费不卡视频| 欧美一区二区三区在线观看视频| 国产精品久久久久婷婷二区次| 亚洲电影第三页| 国产综合色在线视频区| 欧日韩精品视频| 日韩免费一区二区| 中文字幕一区二区三区av| 亚洲高清视频在线| 国产成人综合网| 日韩欧美国产一区在线观看| 伊人婷婷欧美激情| 国产在线精品国自产拍免费| 欧美吞精做爰啪啪高潮| 国产精品乱码一区二区三区软件 | 欧美v国产在线一区二区三区| 亚洲精品一二三四区| 国产成人午夜视频| 99久久婷婷国产综合精品电影| 国产丝袜在线精品| 国产精品综合av一区二区国产馆| 在线观看日韩精品| 亚洲美女视频在线观看| 丁香六月久久综合狠狠色| 久久久久亚洲蜜桃|