Java教程

Java_08 判断图片是否为baselineJPEG

本文主要是介绍Java_08 判断图片是否为baselineJPEG,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 判断图片是否为baselineJPEG

判断图片是否为baselineJPEG

在线网站: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;
    }
}
这篇关于Java_08 判断图片是否为baselineJPEG的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!