在线网站:https://exif.tuchong.com
==========BaselineJpeg========== import java.io.FileInputStream; import java.io.IOException; public class BaselineJpeg { public static void main(String[] args) throws IOException { boolean baseline = isBaseline("D:/others/121212-c.jpg"); System.out.println(baseline); } public static boolean isBaseline(String file) throws IOException { FileInputStream inputStream = new FileInputStream(file); CountedDataInputStream dataStream = new CountedDataInputStream(inputStream); if (dataStream.readShort() != JpegHeader.SOI) { return false; } short marker = dataStream.readShort(); while (marker != JpegHeader.EOI && !JpegHeader.isSofMarker(marker)) { int length = dataStream.readUnsignedShort(); if (length < 2 || (length - 2) != dataStream.skip(length - 2)) { return false; } marker = dataStream.readShort(); } if (marker == JpegHeader.SOF0) { return true; } return false; } } ==========CountedDataInputStream========== import java.io.EOFException; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.Charset; public class CountedDataInputStream extends FilterInputStream { private int mCount = 0; // allocate a byte buffer for a long value; private final byte mByteArray[] = new byte[8]; private final ByteBuffer mByteBuffer = ByteBuffer.wrap(mByteArray); public CountedDataInputStream(InputStream in) { super(in); } public int getReadByteCount() { return mCount; } @Override public int read(byte[] b) throws IOException { int r = in.read(b); mCount += (r >= 0) ? r : 0; return r; } @Override public int read(byte[] b, int off, int len) throws IOException { int r = in.read(b, off, len); mCount += (r >= 0) ? r : 0; return r; } @Override public int read() throws IOException { int r = in.read(); mCount += (r >= 0) ? 1 : 0; return r; } @Override public long skip(long length) throws IOException { long skip = in.skip(length); mCount += skip; return skip; } public void skipOrThrow(long length) throws IOException { if (skip(length) != length) throw new EOFException(); } public void skipTo(long target) throws IOException { long cur = mCount; long diff = target - cur; assert(diff >= 0); skipOrThrow(diff); } public void readOrThrow(byte[] b, int off, int len) throws IOException { int r = read(b, off, len); if (r != len) throw new EOFException(); } public void readOrThrow(byte[] b) throws IOException { readOrThrow(b, 0, b.length); } public void setByteOrder(ByteOrder order) { mByteBuffer.order(order); } public ByteOrder getByteOrder() { return mByteBuffer.order(); } public short readShort() throws IOException { readOrThrow(mByteArray, 0 ,2); mByteBuffer.rewind(); return mByteBuffer.getShort(); } public int readUnsignedShort() throws IOException { return readShort() & 0xffff; } public int readInt() throws IOException { readOrThrow(mByteArray, 0 , 4); mByteBuffer.rewind(); return mByteBuffer.getInt(); } public long readUnsignedInt() throws IOException { return readInt() & 0xffffffffL; } public long readLong() throws IOException { readOrThrow(mByteArray, 0 , 8); mByteBuffer.rewind(); return mByteBuffer.getLong(); } public String readString(int n) throws IOException { byte buf[] = new byte[n]; readOrThrow(buf); return new String(buf, "UTF8"); } public String readString(int n, Charset charset) throws IOException { byte buf[] = new byte[n]; readOrThrow(buf); return new String(buf, charset); } } ==========JpegHeader========== public class JpegHeader { public static final short SOI = (short) 0xFFD8; public static final short APP1 = (short) 0xFFE1; public static final short APP0 = (short) 0xFFE0; public static final short EOI = (short) 0xFFD9; /** * SOF (start of frame). All value between SOF0 and SOF15 is SOF marker except for DHT, JPG, * and DAC marker. */ public static final short SOF0 = (short) 0xFFC0; public static final short SOF2 = (short) 0xFFC2; public static final short SOF15 = (short) 0xFFCF; public static final short DHT = (short) 0xFFC4; public static final short JPG = (short) 0xFFC8; public static final short DAC = (short) 0xFFCC; public static final boolean isSofMarker(short marker) { return marker >= SOF0 && marker <= SOF15 && marker != DHT && marker != JPG && marker != DAC; } }