📄 jpg0902.java
字号:
import java.io.*;
public class Jpg
{ public static void main(String[] args) throws IOException
{ File fin=new File("00440aae.jpg");
BufferedInputStream bin=new BufferedInputStream(new FileInputStream(fin));
Zigzag.init();
JFIF jfif=new JFIF(bin);
bin.close();
File fout=new File("jpg.dat");
PrintWriter pr=new PrintWriter(new OutputStreamWriter(new FileOutputStream(fout)));
jfif.show(pr);
pr.close();
}
}
class JFIF
{ public SOI soi;
public APP0 app0;
public DQT[] dqts;
public SOF sof;
public DHT[] dhts;
public int dqtNum;
public int dhtNum;
public JFIF(InputStream ins) throws IOException
{ int sig;
dqts=new DQT[8];
dhts=new DHT[8];
dqtNum=0;
dhtNum=0;
boolean flag=false;
while(true)
{ sig=(ins.read()<<8)+ins.read();
//System.out.println(sig);
switch (sig)
{ case SOI.sig : soi=new SOI(ins); break;
case APP0.sig : app0=new APP0(ins); break;
case DQT.sig : dqts[dqtNum++]=new DQT(ins); break;
case SOF.sig: sof=new SOF(ins); break;
case DHT.sig: dhts[dhtNum++]=new DHT(ins); break;
default: flag=true;
}
if(flag) break;
}
}
public void show(PrintWriter pr) throws IOException
{ int i;
soi.show(pr);
app0.show(pr);
for(i=0;i<dqtNum;i++) dqts[i].show(pr);
sof.show(pr);
for(i=0;i<dhtNum;i++) dhts[i].show(pr);
}
}
class SOI
{ public static final int sig=0xFFD8;
public SOI(InputStream ins) throws IOException
{
}
public void show(PrintWriter pr)
{ pr.println("SOI : 0xFFD8");
}
}
class APP0
{ public static final int sig=0xFFE0; // 16 bits
public int length; // 16 bits
public long identifier; // 32 bits
public int version; // 16 bits
public int xUnits; // 8 bits
public int yUnits; // 8 bits
public int xDensity; // 16 bits;
public int yDensity; // 16 bits;
public int thumbHpixel; // 8 bits;
public int thumbVpixel; // 8 bits;
public APP0(InputStream ins) throws IOException
{ int i;
length=(ins.read()<<8)+ins.read();
identifier=(ins.read()<<24)+(ins.read()<<16)+(ins.read()<<8)+ins.read();
version=(ins.read()<<8)+ins.read();
xUnits=ins.read();
yUnits=ins.read();
xDensity=(ins.read()<<8)+ins.read();
yDensity=(ins.read()<<8)+ins.read();
thumbHpixel=ins.read();
thumbVpixel=ins.read();
ins.skip(length-0x10);
}
public void show(PrintWriter pr)
{ pr.println("APP0 : 0xFFE0");
pr.println(" length: "+length);
pr.println(" identifier: "+identifier);
pr.println(" version: "+version);
pr.println(" xUnits: "+xUnits);
pr.println(" yUnits: "+yUnits);
pr.println(" xDensity: "+xDensity);
pr.println(" yDensity: "+yDensity);
pr.println(" thumbHpixel: "+thumbHpixel);
pr.println(" thumbVpixel: "+thumbVpixel);
}
}
class DQT
{ public static final int sig=0xFFDB; // 16 bits
public int length; // 16 bits
public int id; // 8 bits;
public int[] table;
public DQT(InputStream ins) throws IOException
{ int i;
length=(ins.read()<<8)+ins.read();
id=ins.read();
table=new int[64];
for(i=0;i<64;i++) table[i]=ins.read();
ins.skip(length-0x43);
}
public void show(PrintWriter pr)
{ pr.println("DQT : 0xFFDB");
pr.println(" length: "+length);
pr.println(" id: "+id);
pr.println(" table:");
int i,j,t;
for(i=0;i<8;i++)
{ pr.print(" ");
for(j=0;j<8;j++)
{ t=table[Zigzag.decode[i*8+j]];
if(t<10) pr.print(" "+t+" ");
else if(t<100) pr.print(" "+t+" ");
else pr.print(t+" ");
}
pr.println();
}
}
}
class SOF
{ public static final int sig=0xFFC0; // 16 bits
public int length; // 16 bits
public int precision; // 8 bits
public int imageHeight; // 16 bits
public int imageWidth; // 16 bits
public int componentNum; // 8 bits
public Component[] components;
public SOF(InputStream ins) throws IOException
{ int i;
length=(ins.read()<<8)+ins.read();
precision=ins.read();
imageHeight=(ins.read()<<8)+ins.read();
imageWidth=(ins.read()<<8)+ins.read();
componentNum=ins.read();
components=new Component[componentNum];
for(i=0;i<componentNum;i++) components[i]=new Component(ins);
ins.skip(length-8-3*componentNum);
}
public void show(PrintWriter pr)
{ pr.println("SOF : 0xFFC0");
pr.println(" length: "+length);
pr.println(" precision: "+precision);
pr.println(" imageHeight: "+imageHeight);
pr.println(" imageWidth: "+imageWidth);
pr.println(" componentNum: "+componentNum);
for(int i=0;i<componentNum;i++) components[i].show(pr);
}
}
class DHT
{ public static final int sig=0xFFC4; //16 bit
public int length; // 16 bit
public int id; // 8 bit
public int[] bitTable; // 16 byte
public int[] valueTable; //
public Hufleaf[] hufTable; //
public DHT(InputStream ins) throws IOException
{ int i,cx;
length=(ins.read()<<8)+ins.read();
id=ins.read();
bitTable=new int[16];
cx=0;
for(i=0;i<16;i++)
{ bitTable[i]=ins.read();
cx+=bitTable[i];
}
valueTable=new int[cx];
for(i=0;i<cx;i++) valueTable[i]=ins.read();
ins.skip(length-19-cx);
makeHufTable();
}
public void makeHufTable()
{ int cx,i,j;
long val;
cx=0;
val=0;
hufTable=new Hufleaf[valueTable.length];
for(i=0;i<16;i++)
{ for(j=0;j<bitTable[i];j++) hufTable[cx++]=new Hufleaf(i+1,val++);
val<<=1;
}
}
public void show(PrintWriter pr)
{ int i;
pr.println("DHT : 0xFFC4");
pr.println(" id: "+id);
pr.println(" length: "+length);
pr.print(" bit table: ");
for(i=0;i<16;i++) pr.print(bitTable[i]+" ");
pr.print("\r\n value table: ");
for(i=0;i<valueTable.length;i++) //pr.print(valueTable[i]+" ");
{ pr.println(valueTable[i]+" "+hufTable[i].len+" "+hufTable[i].value+"\n ");
}
pr.println();
}
}
class Component
{ public int id; // 8 bit;
public int vsf; // 4 bit;
public int hsf; // 4 bit;
public int quantiTable; // 8 bit;
public Component(InputStream ins) throws IOException
{ id=ins.read();
vsf=ins.read();
hsf=vsf/16;
vsf=vsf%16;
quantiTable=ins.read();
}
public void show(PrintWriter pr)
{ pr.println(" Component "+id+" :");
pr.println(" vsf: "+vsf);
pr.println(" hsf: "+hsf);
pr.println(" quantiTable: "+quantiTable);
}
}
class Hufleaf
{ public short len;
public long value;
public Hufleaf(int len_,long value_)
{ len=(short)len_;
value=value_;
}
}
class Zigzag
{ public static int[] encode;
public static int[] decode;
public static void init()
{ String st;
int i;
st="\000\001\005\006\016\017\033\034\002\004\007\015\020\032\035\052\003\010\014\021\031\036\051\053\011\013\022\030\037\050\054\065\012\023\027\040\047\055\064\066\024\026\041\046\056\063\067\074\025\042\045\057\062\070\073\075\043\044\060\061\071\072\076\077";
ByteArrayInputStream bin=new ByteArrayInputStream(st.getBytes());
decode=new int[64];
encode=new int[64];
for(i=0;i<64;i++)
{ decode[i]=bin.read();
encode[decode[i]]=i;
}
}
/* for(int i=0;i<8;i++)
{ for(int j=0;j<8;j++) System.out.print(bin.read()+" ");
System.out.println();
}
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -