ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java_08 判断图片是否为baselineJPEG

2021-11-27 23:01:56  阅读:137  来源: 互联网

标签:short Java int 08 baselineJPEG throws IOException return public


目录

判断图片是否为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;
    }
}

标签:short,Java,int,08,baselineJPEG,throws,IOException,return,public
来源: https://www.cnblogs.com/alpari-wang/p/15613808.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有