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

📄 tiffdirectory.java

📁 处理PDF
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                        ivalues[j] = readInt(stream);                    }                    obj = ivalues;                    break;                                    case TIFFField.TIFF_SRATIONAL:                    int[][] iivalues = new int[count][2];                    for (j = 0; j < count; j++) {                        iivalues[j][0] = readInt(stream);                        iivalues[j][1] = readInt(stream);                    }                    obj = iivalues;                    break;                                    case TIFFField.TIFF_FLOAT:                    float[] fvalues = new float[count];                    for (j = 0; j < count; j++) {                        fvalues[j] = readFloat(stream);                    }                    obj = fvalues;                    break;                                    case TIFFField.TIFF_DOUBLE:                    double[] dvalues = new double[count];                    for (j = 0; j < count; j++) {                        dvalues[j] = readDouble(stream);                    }                    obj = dvalues;                    break;                                    default:                    break;            }                        fields[i] = new TIFFField(tag, type, count, obj);            }                        stream.seek(nextTagOffset);        }                // Read the offset of the next IFD.        try {            nextIFDOffset = readUnsignedInt(stream);        }        catch (Exception e) {            // broken tiffs may not have this pointer            nextIFDOffset = 0;        }    }        /** Returns the number of directory entries. */    public int getNumEntries() {        return numEntries;    }        /**     * Returns the value of a given tag as a TIFFField,     * or null if the tag is not present.     */    public TIFFField getField(int tag) {        Integer i = (Integer)fieldIndex.get(new Integer(tag));        if (i == null) {            return null;        } else {            return fields[i.intValue()];        }    }        /**     * Returns true if a tag appears in the directory.     */    public boolean isTagPresent(int tag) {        return fieldIndex.containsKey(new Integer(tag));    }        /**     * Returns an ordered array of ints indicating the tag     * values.     */    public int[] getTags() {        int[] tags = new int[fieldIndex.size()];        Enumeration e = fieldIndex.keys();        int i = 0;                while (e.hasMoreElements()) {            tags[i++] = ((Integer)e.nextElement()).intValue();        }                return tags;    }        /**     * Returns an array of TIFFFields containing all the fields     * in this directory.     */    public TIFFField[] getFields() {        return fields;    }        /**     * Returns the value of a particular index of a given tag as a     * byte.  The caller is responsible for ensuring that the tag is     * present and has type TIFFField.TIFF_SBYTE, TIFF_BYTE, or     * TIFF_UNDEFINED.     */    public byte getFieldAsByte(int tag, int index) {        Integer i = (Integer)fieldIndex.get(new Integer(tag));        byte [] b = fields[i.intValue()].getAsBytes();        return b[index];    }        /**     * Returns the value of index 0 of a given tag as a     * byte.  The caller is responsible for ensuring that the tag is     * present and has  type TIFFField.TIFF_SBYTE, TIFF_BYTE, or     * TIFF_UNDEFINED.     */    public byte getFieldAsByte(int tag) {        return getFieldAsByte(tag, 0);    }        /**     * Returns the value of a particular index of a given tag as a     * long.  The caller is responsible for ensuring that the tag is     * present and has type TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED,     * TIFF_SHORT, TIFF_SSHORT, TIFF_SLONG or TIFF_LONG.     */    public long getFieldAsLong(int tag, int index) {        Integer i = (Integer)fieldIndex.get(new Integer(tag));        return fields[i.intValue()].getAsLong(index);    }        /**     * Returns the value of index 0 of a given tag as a     * long.  The caller is responsible for ensuring that the tag is     * present and has type TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED,     * TIFF_SHORT, TIFF_SSHORT, TIFF_SLONG or TIFF_LONG.     */    public long getFieldAsLong(int tag) {        return getFieldAsLong(tag, 0);    }        /**     * Returns the value of a particular index of a given tag as a     * float.  The caller is responsible for ensuring that the tag is     * present and has numeric type (all but TIFF_UNDEFINED and     * TIFF_ASCII).     */    public float getFieldAsFloat(int tag, int index) {        Integer i = (Integer)fieldIndex.get(new Integer(tag));        return fields[i.intValue()].getAsFloat(index);    }        /**     * Returns the value of index 0 of a given tag as a float.  The     * caller is responsible for ensuring that the tag is present and     * has numeric type (all but TIFF_UNDEFINED and TIFF_ASCII).     */    public float getFieldAsFloat(int tag) {        return getFieldAsFloat(tag, 0);    }        /**     * Returns the value of a particular index of a given tag as a     * double.  The caller is responsible for ensuring that the tag is     * present and has numeric type (all but TIFF_UNDEFINED and     * TIFF_ASCII).     */    public double getFieldAsDouble(int tag, int index) {        Integer i = (Integer)fieldIndex.get(new Integer(tag));        return fields[i.intValue()].getAsDouble(index);    }        /**     * Returns the value of index 0 of a given tag as a double.  The     * caller is responsible for ensuring that the tag is present and     * has numeric type (all but TIFF_UNDEFINED and TIFF_ASCII).     */    public double getFieldAsDouble(int tag) {        return getFieldAsDouble(tag, 0);    }        // Methods to read primitive data types from the stream        private short readShort(RandomAccessFileOrArray stream)    throws IOException {        if (isBigEndian) {            return stream.readShort();        } else {            return stream.readShortLE();        }    }        private int readUnsignedShort(RandomAccessFileOrArray stream)    throws IOException {        if (isBigEndian) {            return stream.readUnsignedShort();        } else {            return stream.readUnsignedShortLE();        }    }        private int readInt(RandomAccessFileOrArray stream)    throws IOException {        if (isBigEndian) {            return stream.readInt();        } else {            return stream.readIntLE();        }    }        private long readUnsignedInt(RandomAccessFileOrArray stream)    throws IOException {        if (isBigEndian) {            return stream.readUnsignedInt();        } else {            return stream.readUnsignedIntLE();        }    }        private long readLong(RandomAccessFileOrArray stream)    throws IOException {        if (isBigEndian) {            return stream.readLong();        } else {            return stream.readLongLE();        }    }        private float readFloat(RandomAccessFileOrArray stream)    throws IOException {        if (isBigEndian) {            return stream.readFloat();        } else {            return stream.readFloatLE();        }    }        private double readDouble(RandomAccessFileOrArray stream)    throws IOException {        if (isBigEndian) {            return stream.readDouble();        } else {            return stream.readDoubleLE();        }    }        private static int readUnsignedShort(RandomAccessFileOrArray stream,    boolean isBigEndian)    throws IOException {        if (isBigEndian) {            return stream.readUnsignedShort();        } else {            return stream.readUnsignedShortLE();        }    }        private static long readUnsignedInt(RandomAccessFileOrArray stream,    boolean isBigEndian)    throws IOException {        if (isBigEndian) {            return stream.readUnsignedInt();        } else {            return stream.readUnsignedIntLE();        }    }        // Utilities        /**     * Returns the number of image directories (subimages) stored in a     * given TIFF file, represented by a <code>SeekableStream</code>.     */    public static int getNumDirectories(RandomAccessFileOrArray stream)    throws IOException{        long pointer = stream.getFilePointer(); // Save stream pointer                stream.seek(0L);        int endian = stream.readUnsignedShort();        if (!isValidEndianTag(endian)) {            throw new            IllegalArgumentException("Bad endianness tag (not 0x4949 or 0x4d4d).");        }        boolean isBigEndian = (endian == 0x4d4d);        int magic = readUnsignedShort(stream, isBigEndian);        if (magic != 42) {            throw new            IllegalArgumentException("Bad magic number, should be 42.");        }                stream.seek(4L);        long offset = readUnsignedInt(stream, isBigEndian);                int numDirectories = 0;        while (offset != 0L) {            ++numDirectories;                        // EOFException means IFD was probably not properly terminated.            try {                stream.seek(offset);                int entries = readUnsignedShort(stream, isBigEndian);                stream.skip(12*entries);                offset = readUnsignedInt(stream, isBigEndian);            } catch(EOFException eof) {                //numDirectories--;                break;            }        }                stream.seek(pointer); // Reset stream pointer        return numDirectories;    }        /**     * Returns a boolean indicating whether the byte order used in the     * the TIFF file is big-endian (i.e. whether the byte order is from     * the most significant to the least significant)     */    public boolean isBigEndian() {        return isBigEndian;    }        /**     * Returns the offset of the IFD corresponding to this     * <code>TIFFDirectory</code>.     */    public long getIFDOffset() {        return IFDOffset;    }        /**     * Returns the offset of the next IFD after the IFD corresponding to this     * <code>TIFFDirectory</code>.     */    public long getNextIFDOffset() {        return nextIFDOffset;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -