欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java编解码png图片,java编解码png,该代码片段是用来提取pn

来源: javaer 分享于  点击 26354 次 点评:227

java编解码png图片,java编解码png,该代码片段是用来提取pn


该代码片段是用来提取png图片中部分数据,不过不知道是解码有问题,还是编码有问题,还希望有高手能帮我瞧瞧,找出可能的问题。

读取png图片,截取部分数据

    public static void getPngData(String path, Vector vMyPng) {        // vFileNmae.add(path);        DataInputStream dateInput = null;        InputStream is = null;        FileInputStream fr = null;        byte[] pngHead = new byte[8];// 8B 8*8=64bit        int length_Data;// 4B        byte[] ChunkTypeCode_Data = new byte[4];// 4B        char[] crc_Data = new char[2];        MyPng png = new MyPng(path);        // is = new DataInputStream(this.getClass().getResourceAsStream(path));        is = new DataInputStream(IOControl.class.getResourceAsStream(path));        try {            fr = new FileInputStream("res/" + path + ".png");            dateInput = new DataInputStream(fr);            // 建FileReader对象,用来读取字符流            if (is == null) {                System.out.println("1null!!");                return;            }            if (dateInput == null) {                System.out.println("2null!!");                try {                    System.out.println(dateInput.available());                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                return;            }            // dateInput.            try {                // png head                System.out.println(dateInput.readInt());                System.out.println(dateInput.readInt());                System.out.println("======");                System.out.println(0x89504e47);                System.out.println(0x0d0a1a0a);                // other: Length ChunK_Type_Code Chunk_Data CRC                while (true) {                    // dateInput.read(length_Data);                    length_Data = dateInput.readInt();                    System.out.println("l=" + length_Data);                    // 4B ASC-11 1char2B                    for (int i = 0; i < ChunkTypeCode_Data.length; i++) {                        ChunkTypeCode_Data[i] = dateInput.readByte();// 32                    }                    String str = new String(ChunkTypeCode_Data);// ASC-11 java                                                                // class编码采用UTF-8                    System.out.println("TYPE: " + str);                    // "PLTE", "IDAT","IEND", "tRNS"                    if (RESERVED[0].contentEquals(str.trim())) {                        png.IHDR_length = length_Data;                        png.IHDR_ChunkTypeCode = new byte[4];                        for (int i = 0; i < ChunkTypeCode_Data.length; i++) {                            png.IHDR_ChunkTypeCode[i] = ChunkTypeCode_Data[i];                        }                        //png.IHDR_Data = new byte[png.IHDR_length];                        png.width = dateInput.readInt();                        png.height= dateInput.readInt();                        png.bitDepth = dateInput.readByte();                        png.colorType= dateInput.readByte();                         png.compressionMethod= dateInput.readByte();                         png.filterMethod = dateInput.readByte();                        png.interlaceMethod= dateInput.readByte();                         //dateInput.read(png.IHDR_Data);                        System.out.println(png.width);                        System.out.println(png.height);                        System.out.println(png.bitDepth);                        System.out.println(png.colorType);                        System.out.println(png.compressionMethod);                        System.out.println(png.filterMethod);                        System.out.println(png.interlaceMethod);                        // System.out.println(new String(png.IHDR_Data));                        png.IHDR_crc = dateInput.readInt();                    } else if (RESERVED[1].contentEquals(str.trim())) {// "PLTE"                        png.plte = true;                        png.PLTE_length = length_Data;                        png.PLTE_ChunkTypeCode = new byte[4];                        for (int i = 0; i < ChunkTypeCode_Data.length; i++) {                            png.PLTE_ChunkTypeCode[i] = ChunkTypeCode_Data[i];                        }                        png.PLTE_Data = new byte[png.PLTE_length];                        dateInput.read(png.PLTE_Data);                        png.PLTE_crc = dateInput.readInt();                    } else if (RESERVED[2].contentEquals(str.trim())) {// "IDAT"                        byte[] data = new byte[length_Data];                        dateInput.read(data);                        png.setDate(length_Data, ChunkTypeCode_Data, data,                                dateInput.readInt());                    } else if (RESERVED[3].contentEquals(str.trim())) {// "IEND"                    // png.IEND_length = length_Data;                    // System.out.println(Integer.toHexString(png.IEND_length));                    //                    // png.IEND_ChunkTypeCode = new byte[4];                    // for(int i=0;i<ChunkTypeCode_Data.length;i++){                    // png.IEND_ChunkTypeCode[i] = ChunkTypeCode_Data[i];                    // }                    // System.out.println(new String(png.IEND_ChunkTypeCode));                    // png.IEND_Data = new byte[length_Data];                    // dateInput.read(png.IEND_Data);                    // //System.out.println(new String(png.IEND_Data));                    // //dateInput.read(PLTE_crc);                    // png.IEND_crc = dateInput.readInt();                    // System.out.println(Integer.toHexString(png.IEND_crc));                        vMyPng.add(png);                        return;                    } else if (RESERVED[4].contentEquals(str.trim())) {// "tRNS"                        png.tRNS = true;                        png.tRNS_length = length_Data;                        png.tRNS_ChunkTypeCode = new byte[4];                        for (int i = 0; i < ChunkTypeCode_Data.length; i++) {                            png.tRNS_ChunkTypeCode[i] = ChunkTypeCode_Data[i];                        }                        png.tRNS_Data = new byte[length_Data];                        dateInput.read(png.tRNS_Data);                        png.tRNS_crc = dateInput.readInt();                    } else {                        int counts = length_Data;                        System.out.println(counts);                        dateInput.skipBytes(counts + 4);                    }                }                // IEND            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            fr.close();            dateInput.close();            is.close();        } catch (FileNotFoundException e1) {            // TODO Auto-generated catch block            e1.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

将截取的png数据,新建一个png

public static void putFile(Vector vMyPng) {//禁用read 跟 write        DataOutputStream dateOutput = null;        Enumeration e = vMyPng.elements();        while (e.hasMoreElements()) {            try {// 20 20 xiao                MyPng png = (MyPng) e.nextElement();                FileOutputStream fo = new FileOutputStream("d:\\" + png.strName                        + ".png");                dateOutput = new DataOutputStream(fo);                //file                dateOutput.writeInt(0x89504e47);                dateOutput.writeInt(0x0d0a1a0a);                // IHDR; int4 short2 short2                dateOutput.writeInt(13);                dateOutput.writeInt(0x49484452);                //dateOutput.writeInt(0x49484452);                dateOutput.writeInt(png.width);                dateOutput.writeInt(png.height);                dateOutput.writeByte(png.bitDepth);                dateOutput.writeByte(png.colorType);                dateOutput.writeByte(png.compressionMethod);                dateOutput.writeByte(png.filterMethod);                dateOutput.writeByte(png.interlaceMethod);                dateOutput.writeInt(png.IHDR_crc);                // PLTE;                dateOutput.writeBoolean(png.plte);                if (png.plte) {                    dateOutput.writeInt(png.PLTE_length);                    System.out.println(png.PLTE_length);                    //dateOutput.write(png.PLTE_ChunkTypeCode);                    dateOutput.writeInt(0x504C5445);                    for(int i=0;i<png.PLTE_length;i++){                        dateOutput.writeByte(png.PLTE_Data[i]);                    }                    dateOutput.writeInt(png.PLTE_crc);                }                // tRNS;                dateOutput.writeBoolean(png.tRNS);                if (png.tRNS) {                    dateOutput.writeInt(png.tRNS_length);                    //dateOutput.write(png.tRNS_ChunkTypeCode);                    dateOutput.writeInt(0x74524E53);                    //dateOutput.write(png.tRNS_Data);                    for(int i=0;i<png.tRNS_length;i++){                        dateOutput.writeByte(png.tRNS_Data[i]);                    }                    dateOutput.writeInt(png.tRNS_crc);                }                // IDAT;                dateOutput.writeInt(png.idatCounts);                System.out.println("png.idatCounts: " + png.idatCounts);                for (int i = 0; i < png.idatCounts; i++) {                    dateOutput.writeInt(png.IDAT_length[i]);                    System.out.println(png.IDAT_length[i]);                    dateOutput.writeInt(0x49444154);                    for(int j=0;j<png.IDAT_length[i];j++){                        dateOutput.writeByte(png.IDAT_Data[i][j]);                        System.out.println();                    }                    System.out.println(png.IDAT_Data[i].length+" i="+i);                    dateOutput.writeInt(png.IDAT_crc[i]);                }                // End                System.out.println("end---");                dateOutput.writeInt(0x00000000);// Length                dateOutput.writeInt(0x49454e44);// IEND                dateOutput.writeInt(0xae426082);// CRC                System.out.println(dateOutput.size());                dateOutput.flush();                fo.close();                System.out.println(dateOutput.size());            } catch (FileNotFoundException e1) {                // TODO Auto-generated catch block                e1.printStackTrace();            } catch (IOException ioe) {                ioe.printStackTrace();            }        }        try {            dateOutput.flush();            dateOutput.close();        } catch (IOException e1) {            // TODO Auto-generated catch block            e1.printStackTrace();        }    }

png对象

public class MyPng {    public static final int head1 = 0x89504e47;    public static final int head2 = 0x0d0a1a0a;    private final int max = 10;    boolean tRNS;    boolean plte;    int idatCounts;    String strName;    int IHDR_length;    int PLTE_length;    int tRNS_length;    int[] IDAT_length = new int[max];    int IEND_length;    byte[] IHDR_ChunkTypeCode;    byte[] PLTE_ChunkTypeCode;    byte[] tRNS_ChunkTypeCode;    byte[][] IDAT_ChunkTypeCode = new byte[max][];    byte[] IEND_ChunkTypeCode;    byte[] IHDR_Data;    byte[] PLTE_Data;    byte[] tRNS_Data;    public byte[][] IDAT_Data = new byte[max][];    byte[] IEND_Data;    int IHDR_crc;    int PLTE_crc;    int tRNS_crc;    int[] IDAT_crc = new int[max];    int IEND_crc;    public MyPng(String name){        this.strName = name;    }    public void setDate(int length,byte[] chunkTypeCode,byte[] idate_Data,int crc){        for(int i=0;i<max;i++){            if(IDAT_Data[i]==null){                IDAT_length[i] = length;                    IDAT_ChunkTypeCode[i] = new byte[4];                for(int a=0;a<chunkTypeCode.length;a++){                    IDAT_ChunkTypeCode[i][a] = chunkTypeCode[a];                }                System.out.println("  "+new String(IDAT_ChunkTypeCode[i]));                IDAT_Data[i] = idate_Data;                IDAT_crc[i] =crc;                idatCounts++;                break;            }        }    }}
相关栏目:

用户点评