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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? exif.java

?? 很棒的web服務器源代碼
?? JAVA
字號:
// Exif.java// $Id: Exif.java,v 1.1 2003/07/23 12:08:01 ylafon Exp $// Copyright (c) 2003 Norman Walsh// Please first read the full copyright statement in file COPYRIGHTpackage org.w3c.tools.jpeg;import java.util.Hashtable;/** * An API for accessing EXIF encoded information in a JPEG file. * * <p>JPEG images are stored in a tagged format reminiscent of TIFF files. * Each component of the image is identified with a tag number and a size. * This allows applications that read JPEG files to skip over information * that they don't understand.</p> * * <p>Additional resources:</p> * <ul> * <li>Official standards, http://www.exif.org/specifications.html</li> * <li>TsuruZoh Tachibanaya's excellent description, * http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html * </li> * <li>Matthias Wandel's JHead, http://www.sentex.net/~mwandel/jhead * </ul> * * <p>This class treats a byte array as a JPEG image and parses the tags * searching for EXIF data. EXIF data is also tagged. Based on information * provided by the caller, this class builds a hash of EXIF data and * makes it available to the caller.</p> * * <p>Most simple EXIF values are tagged with both their identity and their * format. For example, ExposureTime (0x829A) is a rational number and * this class can extract that value. However, some fields are of "unknown" * format. If you decode one of these, you can add a special purpose decode * for that field by associating the name of the decoder class with the * field name. For example, my Nikon CoolPix 950 includes a MakerNote (0x927C) * field that's tagged "unknown" format. Using information from TsuruZoh's * page, I've built a decoder for that field and added it as an example.</p> * * <p>In addition to the tagged data, JPEG images have five intrinisic * properties: height, width, the compression algorithm used, the number of  * bits used to store each pixel value, and the number of color components. * This class allows the caller to unify those intrinsic components with the * tagged data.</p> * * <p>In an effort to be flexible without requiring users to change the * source, a fair bit of setup is needed to use this class.</p> * * <p>The caller must:</p> * * <ol> * <li>Construct an Exif object, <code>exif = new Exif()</code>.</li> * <li>Associate names with each of the tags of interest, *     <code>exif.addTag(<em>nnn</em>, "<em>name</em>")</code>.</li> * <li>Associate names with the intrinsic values: *   <ul> *     <li><code>exif.addHeight("<em>name</em>")</code> *     <li><code>exif.addWidth("<em>name</em>")</code> *     <li><code>exif.addCompression("<em>name</em>")</code> *     <li><code>exif.addNumberOfColorComponents("<em>name</em>")</code> *     <li><code>exif.addBitsPerPixel("<em>name</em>")</code> *   </ul> * </li> * <li>Finally, the caller may associate a decoder with specific fields: * <code>exif.addDecoder("<em>name</em>", "<em>java.class.name</em>")</code>. * </li> * </ol> * * <p>Having setup the exif object, it can be passed to JpegHeaders to be  * filled in when the JPEG file is parsed.</p> * * <p>The caller must also explicitly set the intrinsic values since they do * not come from the EXIF data.</p> * * <p>After parsing the JPEG, call <code>exif.getTags()</code> to get back the * has of name/value pairs.</p> * * @version $Revision: 1.1 $ * @author  Norman Walsh * @see ExifData * @see TagDecoder * @see JpegHeaders */public class Exif {    private static final int TAG_EXIF_OFFSET = 0x8769;    private static final int TAG_INTEROP_OFFSET = 0xa005;    private Hashtable tags = new Hashtable();    private Hashtable exif = new Hashtable();    private Hashtable decoder = new Hashtable();    private ExifData data = null;    private boolean intelOrder = false;    private String tagHeight = null;    private String tagWidth = null;    private String tagComp = null;    private String tagBPP = null;    private String tagNumCC = null;    public void parseExif(byte[] exifData) {	data = new ExifData(exifData);	if (!data.isExifData()) {	    return;	}	int firstOffset = data.get32u(10);	processExifDir(6+firstOffset, 6);    }    public void setHeight(int height) {	if (tagHeight != null) {	    exif.put(tagHeight, ""+height);	}    }    public void setWidth(int width) {	if (tagWidth != null) {	    exif.put(tagWidth, ""+width);	}    }    public void setCompression(String comp) {	if (tagComp != null) {	    exif.put(tagComp, comp);	}    }    public void setBPP(int bitsPP) {	if (tagBPP != null) {	    exif.put(tagBPP, ""+bitsPP);	}    }    public void setNumCC(int numCC) {	if (tagNumCC != null) {	    exif.put(tagNumCC, ""+numCC);	}    }    public void addHeight(String name) {	tagHeight = name;    }    public void addWidth(String name) {	tagWidth = name;    }    public void addCompression(String name) {	tagComp = name;    }    public void addBitsPerPixel(String name) {	tagBPP = name;    }    public void addNumberOfColorComponents(String name) {	tagNumCC = name;    }    public void addTag(int tag, String tagName) {	tags.put(new Integer(tag), tagName);    }    public void addDecoder(String name, String className) {	decoder.put(name, className);    }    public Hashtable getTags() {	return exif;    }    protected void processExifDir(int dirStart,				  int offsetBase) {	int numEntries = data.get16u(dirStart);	//System.err.println("EXIF: numEntries: " + numEntries);	for (int de = 0; de < numEntries; de++) {	    int dirOffset = dirStart + 2 + (12 * de);	    int tag = data.get16u(dirOffset);	    int format = data.get16u(dirOffset+2);	    int components = data.get32u(dirOffset+4);	    //System.err.println("EXIF: entry: 0x" + Integer.toHexString(tag)	    //		 + " " + format	    //		 + " " + components);	    if (format < 0 || format > data.NUM_FORMATS) {		System.err.println("Bad number of formats in EXIF dir: " +				   format);		return;	    }	    int byteCount = components * ExifData.bytesPerFormat[format];	    int valueOffset = dirOffset + 8;	    if (byteCount > 4) {		int offsetVal = data.get32u(dirOffset+8);		valueOffset = offsetBase + offsetVal;	    }	    //System.err.println("valueOffset: " + valueOffset + 	    //                                     " byteCount: " + byteCount);	    Integer iTag = new Integer(tag);	    if (tag == TAG_EXIF_OFFSET || tag == TAG_INTEROP_OFFSET) {		int subdirOffset = data.get32u(valueOffset);		//System.err.println("offset: " + subdirOffset+		//                                ":"+offsetBase+subdirOffset);		processExifDir(offsetBase+subdirOffset, offsetBase);	    } else {		String tagName = "BugBugBug";		boolean usedTag = false;		if (tags.containsKey(iTag)) {		    tagName = (String) tags.get(iTag);		    usedTag = true;		} else {		    tagName = ":unknown0x" + 			                  Integer.toHexString(iTag.intValue());		}		if (decoder.containsKey(tagName)) {		    String className = (String) decoder.get(tagName);		    TagDecoder decoder = null;		    try {			decoder = (TagDecoder) 			                Class.forName(className).newInstance();		    } catch (ClassNotFoundException cnfe) {			System.err.println("Class not found: " + className);		    } catch (InstantiationException cnfe) {			System.err.println("Failed to instantiate " +					   className);		    } catch (IllegalAccessException cnfe) {			System.err.println("Illegal access instantiating " +					   className);		    } catch (ClassCastException cnfe) {			System.err.println("Class " + className + 					   " is not a TagDecoder");		    }		    if (decoder != null) {			decoder.decode(exif, data, format, valueOffset, 				       byteCount);		    }		} else {		    switch (format) {		    case ExifData.FMT_UNDEFINED:			assignUndefined(tagName, valueOffset, byteCount);			break;		    case ExifData.FMT_STRING:			assignString(tagName, valueOffset, byteCount);			break;		    case ExifData.FMT_SBYTE:			assignSByte(tagName, valueOffset);			break;		    case ExifData.FMT_BYTE:			assignByte(tagName, valueOffset);			break;		    case ExifData.FMT_USHORT:			assignUShort(tagName, valueOffset);			break;		    case ExifData.FMT_SSHORT:			assignSShort(tagName, valueOffset);			break;		    case ExifData.FMT_ULONG:			assignULong(tagName, valueOffset);			break;		    case ExifData.FMT_SLONG:			assignSLong(tagName, valueOffset);			break;		    case ExifData.FMT_URATIONAL:		    case ExifData.FMT_SRATIONAL:			assignRational(tagName, valueOffset);			break;		    default:			//System.err.println("Unknown format " + format + 			//                   " for " + tagName);		    }		}	    }	}    }    protected void assignUndefined(String tagName, int offset, int length) {	String result = data.getUndefined(offset, length);	if (!"".equals(result)) {	    exif.put(tagName, result);	}    }    protected void assignString(String tagName, int offset, int length) {	String result = data.getString(offset, length);	if (!"".equals(result)) {	    exif.put(tagName, result);	}    }    protected void assignSByte(String tagName, int offset) {	int result = (int) data.convertAnyValue(ExifData.FMT_SBYTE, offset);	//System.err.println("\t" + tagName + ": " + result);	exif.put(tagName, ""+result);    }    protected void assignByte(String tagName, int offset) {	int result = (int) data.convertAnyValue(ExifData.FMT_BYTE, offset);	//System.err.println("\t" + tagName + ": " + result);	exif.put(tagName, ""+result);    }    protected void assignUShort(String tagName, int offset) {	int result = (int) data.convertAnyValue(ExifData.FMT_USHORT, offset);	//System.err.println("\t" + tagName + ": " + result);	exif.put(tagName, ""+result);    }    protected void assignSShort(String tagName, int offset) {	int result = (int) data.convertAnyValue(ExifData.FMT_SSHORT, offset);	//System.err.println("\t" + tagName + ": " + result);	exif.put(tagName, ""+result);    }    protected void assignULong(String tagName, int offset) {	int result = (int) data.convertAnyValue(ExifData.FMT_ULONG, offset);	//System.err.println("\t" + tagName + ": " + result);	exif.put(tagName, ""+result);    }    protected void assignSLong(String tagName, int offset) {	int result = (int) data.convertAnyValue(ExifData.FMT_SLONG, offset);	//System.err.println("\t" + tagName + ": " + result);	exif.put(tagName, ""+result);    }    protected void assignRational(String tagName, int offset) {	int num = data.get32s(offset);	int den = data.get32s(offset+4);	String result = "";	// This is a bit silly, I really ought to find a real GCD algorithm	if (num % 10 == 0 && den % 10 == 0) {	    num = num / 10;	    den = den / 10;	}	if (num % 5 == 0 && den % 5 == 0) {	    num = num / 5;	    den = den / 5;	}	if (num % 3 == 0 && den % 3 == 0) {	    num = num / 3;	    den = den / 3;	}	if (num % 2 == 0 && den % 2 == 0) {	    num = num / 2;	    den = den / 2;	}	if (den == 0) {	    result = "0";	} else if (den == 1) {	    result = "" + num; // "" + int sure looks ugly...	} else {	    result = "" + num + "/" + den;	}	//System.err.println("\t" + tagName + ": " + result);	exif.put(tagName, ""+result);    }}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本欧美韩国一区三区| 亚洲欧美日本韩国| 欧美亚洲禁片免费| 色婷婷久久久亚洲一区二区三区| 国产91精品一区二区麻豆亚洲| 国产一区 二区 三区一级| 极品销魂美女一区二区三区| 美女久久久精品| 国产精品一区二区久激情瑜伽| 国产成人精品免费一区二区| 成人看片黄a免费看在线| 99久久综合精品| 日本道精品一区二区三区 | 日韩欧美美女一区二区三区| 67194成人在线观看| 精品久久久久久久人人人人传媒| 久久午夜国产精品| 亚洲人成影院在线观看| 亚洲国产一区二区视频| 蜜桃久久av一区| 成人av免费网站| 欧美日韩另类国产亚洲欧美一级| 欧美一区二区三区性视频| 久久精品人人做人人爽97| 亚洲欧美区自拍先锋| 日本美女视频一区二区| 国产99精品视频| 欧美久久一区二区| 国产日韩欧美麻豆| 亚洲国产色一区| 国产精品亚洲第一 | 亚洲电影你懂得| 老司机午夜精品99久久| 成人免费黄色在线| 欧美一级黄色片| 一区在线播放视频| 麻豆久久久久久| 日本久久精品电影| 久久青草欧美一区二区三区| 亚洲精品中文在线观看| 国产在线看一区| 欧美巨大另类极品videosbest| 中文字幕高清不卡| 久久99精品久久久久久国产越南 | av一本久道久久综合久久鬼色| 欧美日韩国产免费一区二区| 国产精品进线69影院| 精品中文字幕一区二区小辣椒| 色先锋aa成人| 日韩av在线免费观看不卡| 成人av在线影院| 久久人人97超碰com| 久久精品免费看| 欧美老女人在线| 一区二区三区.www| 91在线观看污| 中文字幕一区二区三区四区 | 欧美性猛交xxxxxx富婆| 国产精品无人区| 国产黄人亚洲片| 2020日本不卡一区二区视频| 日韩电影在线观看一区| 欧美午夜精品一区| 一二三区精品福利视频| 91在线视频18| 欧美激情一二三区| 国产盗摄女厕一区二区三区| 精品国产乱码久久久久久牛牛| 午夜精品久久一牛影视| 欧美日韩国产美| 日韩一区欧美二区| 9191久久久久久久久久久| 亚洲第一福利视频在线| 欧美日韩国产a| 日韩**一区毛片| 欧美一区2区视频在线观看| 三级成人在线视频| 91精品国产欧美一区二区18| 日本亚洲电影天堂| 欧美xxxxxxxx| 国产在线不卡一卡二卡三卡四卡| 久久综合九色欧美综合狠狠 | 国产精品久久久久久久久免费樱桃| 国产一区美女在线| 国产精品欧美经典| 色欲综合视频天天天| 亚洲成a人v欧美综合天堂下载 | 欧美一级xxx| 韩国av一区二区三区在线观看| 精品国产露脸精彩对白| 成人毛片老司机大片| 一区二区三区四区中文字幕| 欧美精选午夜久久久乱码6080| 青草国产精品久久久久久| 久久久99久久| 在线观看亚洲精品视频| 精品亚洲porn| 18欧美乱大交hd1984| 欧美日韩国产首页在线观看| 精品一区二区免费在线观看| 国产精品成人在线观看| 欧美日韩激情一区二区| 国产剧情一区二区| 亚洲毛片av在线| 日韩精品综合一本久道在线视频| 岛国av在线一区| 天天综合网天天综合色| 中文字幕欧美日韩一区| 91精品国产麻豆| 成人av免费网站| 久久精品国产999大香线蕉| 成人欧美一区二区三区黑人麻豆 | 偷偷要91色婷婷| 久久女同互慰一区二区三区| 色综合婷婷久久| 激情文学综合丁香| 亚洲线精品一区二区三区| 国产嫩草影院久久久久| 91麻豆精品国产91久久久使用方法| 国产成人av影院| 久久国产精品免费| 亚洲大片精品永久免费| 亚洲婷婷国产精品电影人久久| 日韩一本二本av| 欧美私人免费视频| 北条麻妃一区二区三区| 久久不见久久见免费视频1| 亚洲制服丝袜在线| 国产精品久久久久一区二区三区共| 在线成人小视频| 欧美三级电影网| 色综合久久综合网| 成人精品视频一区二区三区尤物| 蜜桃精品视频在线观看| 午夜伦理一区二区| 亚洲图片欧美视频| 亚洲精品美国一| 国产精品久久久久久久久久免费看 | 91黄视频在线观看| 成人h精品动漫一区二区三区| 国产呦精品一区二区三区网站| 婷婷国产v国产偷v亚洲高清| 亚洲一区在线观看免费| 一区二区三区中文字幕| 亚洲精品高清视频在线观看| 成人免费在线视频观看| 日韩一区欧美一区| 亚洲同性同志一二三专区| 亚洲人成精品久久久久| 亚洲欧美日韩综合aⅴ视频| 亚洲欧洲av另类| 亚洲精选视频免费看| 亚洲一区二区三区四区的 | 欧美mv日韩mv亚洲| 日韩欧美电影一区| 精品久久久久一区二区国产| 久久蜜桃一区二区| 亚洲国产精品二十页| 中文字幕在线一区免费| 中文字幕佐山爱一区二区免费| 亚洲激情在线激情| 日韩二区在线观看| 美女网站一区二区| 国产aⅴ综合色| 91视频国产观看| 欧美日韩高清一区二区三区| 欧美一卡二卡在线| 久久婷婷一区二区三区| 国产精品毛片无遮挡高清| 亚洲欧美激情插| 偷拍自拍另类欧美| 黄页网站大全一区二区| 国产91精品一区二区| 在线视频中文字幕一区二区| 欧美精品在线视频| 久久久www成人免费毛片麻豆| 国产精品美女久久久久久久久| 亚洲综合免费观看高清完整版 | 欧美激情一区在线| 亚洲综合一区二区| 欧美视频在线观看一区| 666欧美在线视频| 国产欧美精品一区| 亚洲成人高清在线| 国产成人精品免费视频网站| 欧美三级电影网站| 欧美激情一区二区三区全黄| 亚洲一本大道在线| 成人免费视频播放| 日韩一区二区免费视频| 国产精品久久久久aaaa| 日本不卡在线视频| 99精品视频中文字幕| 日韩欧美国产小视频| 亚洲人吸女人奶水| 成人在线综合网站| 日韩一区二区在线观看视频| 亚洲欧洲在线观看av| 久久国内精品视频| 欧美日韩一区二区三区免费看 |