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

📄 jpg0902.java

📁 JPEG Head Reader(proto)
💻 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 + -