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

📄 gifencoder.java

📁 openmap java写的开源数字地图程序. 用applet实现,可以像google map 那样放大缩小地图.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        else            Putbyte((byte) 0x00, outs);        // Write out the initial code size        Putbyte((byte) InitCodeSize, outs);        // Go and actually compress the data        compress(InitCodeSize + 1, outs);        // Write out a Zero-length packet (to end the series)        Putbyte((byte) 0, outs);        // Write the GIF file terminator        Putbyte((byte) ';', outs);    }    // Bump the 'curx' and 'cury' to point to the next pixel    void BumpPixel() {        // Bump the current X position        ++curx;        // If we are at the end of a scan line, set curx back to the        // beginning        // If we are interlaced, bump the cury to the appropriate        // spot,        // otherwise, just increment it.        if (curx == Width) {            curx = 0;            if (!Interlace) {                ++cury;            } else {                switch (Pass) {                case 0:                    cury += 8;                    if (cury >= Height) {                        ++Pass;                        cury = 4;                    }                    break;                case 1:                    cury += 8;                    if (cury >= Height) {                        ++Pass;                        cury = 2;                    }                    break;                case 2:                    cury += 4;                    if (cury >= Height) {                        ++Pass;                        cury = 1;                    }                    break;                case 3:                    cury += 2;                    break;                }            }        }    }    static final int EOF = -1;    // Return the next pixel from the image    int GIFNextPixel() throws IOException {        byte r;        if (CountDown == 0) {            return EOF;        }        --CountDown;        r = GetPixel(curx, cury);        BumpPixel();        return r & 0xff;    }    // Write out a word to the GIF file    void Putword(int w, OutputStream outs) throws IOException {        Putbyte((byte) (w & 0xff), outs);        Putbyte((byte) ((w >> 8) & 0xff), outs);    }    // Write out a byte to the GIF file    void Putbyte(byte b, OutputStream outs) throws IOException {        outs.write(b);    }    // GIFCOMPR.C - GIF Image compression routines    //    // Lempel-Ziv compression based on 'compress'. GIF modifications    // by    // David Rowley (mgardi@watdcsu.waterloo.edu)    // General DEFINEs    static final int BITS = 12;    static final int HSIZE = 5003; // 80% occupancy    // GIF Image compression - modified 'compress'    //    // Based on: compress.c - File compression ala IEEE Computer, June    // 1984.    //    // By Authors: Spencer W. Thomas    // (decvax!harpo!utah-cs!utah-gr!thomas)    //              Jim McKie (decvax!mcvax!jim)    //              Steve Davies (decvax!vax135!petsd!peora!srd)    //              Ken Turkowski (decvax!decwrl!turtlevax!ken)    //              James A. Woods (decvax!ihnp4!ames!jaw)    //              Joe Orost (decvax!vax135!petsd!joe)    int n_bits; // number of bits/code    int maxbits = BITS; // user settable max # bits/code    int maxcode; // maximum code, given n_bits    int maxmaxcode = 1 << BITS; // should NEVER generate this code    final int MAXCODE(int n_bits) {        return (1 << n_bits) - 1;    }    int[] htab = new int[HSIZE];    int[] codetab = new int[HSIZE];    int hsize = HSIZE; // for dynamic table sizing    int free_ent = 0; // first unused entry    // block compression parameters -- after all codes are used up,    // and compression rate changes, start over.    boolean clear_flg = false;    // Algorithm: use open addressing double hashing (no chaining) on    // the prefix code / next character combination. We do a variant    // of Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's    // relatively-prime secondary probe. Here, the modular division    // first probe is gives way to a faster exclusive-or manipulation.    // Also do block compression with an adaptive reset, whereby the    // code table is cleared when the compression ratio decreases, but    // after the table fills. The variable-length output codes are    // re-sized at this point, and a special CLEAR code is generated    // for the decompressor. Late addition: construct the table    // according to file size for noticeable speed improvement on    // small files. Please direct questions about this implementation    // to ames!jaw.    int g_init_bits;    int ClearCode;    int EOFCode;    void compress(int init_bits, OutputStream outs) throws IOException {        int fcode;        int i /* = 0 */;        int c;        int ent;        int disp;        int hsize_reg;        int hshift;        // Set up the globals: g_init_bits - initial number of bits        g_init_bits = init_bits;        // Set up the necessary values        clear_flg = false;        n_bits = g_init_bits;        maxcode = MAXCODE(n_bits);        ClearCode = 1 << (init_bits - 1);        EOFCode = ClearCode + 1;        free_ent = ClearCode + 2;        char_init();        ent = GIFNextPixel();        hshift = 0;        for (fcode = hsize; fcode < 65536; fcode *= 2)            ++hshift;        hshift = 8 - hshift; // set hash code range bound        hsize_reg = hsize;        cl_hash(hsize_reg); // clear hash table        output(ClearCode, outs);        outer_loop: while ((c = GIFNextPixel()) != EOF) {            fcode = (c << maxbits) + ent;            i = (c << hshift) ^ ent; // xor hashing            if (htab[i] == fcode) {                ent = codetab[i];                continue;            } else if (htab[i] >= 0) { // non-empty slot                disp = hsize_reg - i; // secondary hash (after G.                                      // Knott)                if (i == 0)                    disp = 1;                do {                    if ((i -= disp) < 0)                        i += hsize_reg;                    if (htab[i] == fcode) {                        ent = codetab[i];                        continue outer_loop;                    }                } while (htab[i] >= 0);            }            output(ent, outs);            ent = c;            if (free_ent < maxmaxcode) {                codetab[i] = free_ent++; // code -> hashtable                htab[i] = fcode;            } else {                cl_block(outs);            }        }        // Put out the final code.        output(ent, outs);        output(EOFCode, outs);    }    // output    //    // Output the given code.    // Inputs:    //      code: A n_bits-bit integer. If == -1, then EOF. This assumes    //              that n_bits =< wordsize - 1.    // Outputs:    //      Outputs code to the file.    // Assumptions:    //      Chars are 8 bits long.    // Algorithm:    //      Maintain a BITS character long buffer (so that 8 codes will    // fit in it exactly). Use the VAX insv instruction to insert each    // code in turn. When the buffer fills up empty it and start over.    int cur_accum = 0;    int cur_bits = 0;    int masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F,            0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF,            0x7FFF, 0xFFFF };    void output(int code, OutputStream outs) throws IOException {        cur_accum &= masks[cur_bits];        if (cur_bits > 0)            cur_accum |= (code << cur_bits);        else            cur_accum = code;        cur_bits += n_bits;        while (cur_bits >= 8) {            char_out((byte) (cur_accum & 0xff), outs);            cur_accum >>= 8;            cur_bits -= 8;        }        // If the next entry is going to be too big for the code size,        // then increase it, if possible.        if (free_ent > maxcode || clear_flg) {            if (clear_flg) {                maxcode = MAXCODE(n_bits = g_init_bits);                clear_flg = false;            } else {                ++n_bits;                if (n_bits == maxbits)                    maxcode = maxmaxcode;                else                    maxcode = MAXCODE(n_bits);            }        }        if (code == EOFCode) {            // At EOF, write the rest of the buffer.            while (cur_bits > 0) {                char_out((byte) (cur_accum & 0xff), outs);                cur_accum >>= 8;                cur_bits -= 8;            }            flush_char(outs);        }    }    // Clear out the hash table    // table clear for block compress    void cl_block(OutputStream outs) throws IOException {        cl_hash(hsize);        free_ent = ClearCode + 2;        clear_flg = true;        output(ClearCode, outs);    }    // reset code table    void cl_hash(int hsize) {        for (int i = 0; i < hsize; ++i)            htab[i] = -1;    }    // GIF Specific routines    // Number of characters so far in this 'packet'    int a_count;    // Set up the 'byte output' routine    void char_init() {        a_count = 0;    }    // Define the storage for the packet accumulator    byte[] accum = new byte[256];    // Add a character to the end of the current packet, and if it is    // 254    // characters, flush the packet to disk.    void char_out(byte c, OutputStream outs) throws IOException {        accum[a_count++] = c;        if (a_count >= 254)            flush_char(outs);    }    // Flush the packet to disk, and reset the accumulator    void flush_char(OutputStream outs) throws IOException {        if (a_count > 0) {            outs.write(a_count);            outs.write(accum, 0, a_count);            a_count = 0;        }    }}class GifEncoderHashitem {    public int rgb;    public int count;    public int index;    public boolean isTransparent;    public GifEncoderHashitem(int rgb, int count, int index,            boolean isTransparent) {        this.rgb = rgb;        this.count = count;        this.index = index;        this.isTransparent = isTransparent;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -