亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? palettedimage.java

?? 用j2me midp1.0,原碼正宗
?? JAVA
字號(hào):

import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.microedition.lcdui.Image;

/**
 * PalettedImage調(diào)色板圖片類,使用PNG-8圖片,可更換其中的顏色。 <br>
 * 注意,除了更換調(diào)色板中的顏色之外,這個(gè)類實(shí)際上是不可更改的Image。
 * 
 * @author flyingghost
 * @version 1.0
 */
public final class PalettedImage {

    private Image image;//生成的圖片

    private byte[] imgData;//圖片字節(jié)數(shù)據(jù)

    private int paletteOffset;//調(diào)色板偏移量

    private int CRCOffset;//CRC校驗(yàn)碼偏移量

    private int paletteColors;//調(diào)色板顏色數(shù)

    private boolean needRebuild;//改變,需要重建立圖片

    private PalettedImage() {
    }

    /**
     * 從字節(jié)數(shù)組中創(chuàng)建PalettedImage
     * 
     * @param data
     *            存放png圖片的字節(jié)數(shù)組
     * @return PalettedImage對(duì)象
     * @throws NullPointerException
     *             當(dāng)data數(shù)組為空時(shí)
     */
    public static PalettedImage createPalettedImage(byte[] data) {
        if (data == null) {
            throw new NullPointerException();
        }
        PalettedImage pImage = null;
        pImage = new PalettedImage();
        pImage.imgData = data;
        pImage.analyze();
        pImage.image = Image.createImage(pImage.imgData, 0,
                pImage.imgData.length);
        return pImage;
    }

    /**
     * 從圖片文件中創(chuàng)建PalettedImage
     * 
     * @param filename
     *            png圖片文件路徑
     * @return PalettedImage對(duì)象
     * @throws NullPointerException
     *             當(dāng)filename為空時(shí)
     * @throws IllegalArgumentException
     *             當(dāng)路徑無效的時(shí)候
     * @throws IOException
     *             當(dāng)發(fā)生IO錯(cuò)誤時(shí)
     */
    public static PalettedImage createPalettedImage(String filename)
            throws IOException {
        if (filename == null) {
            throw new NullPointerException();
        }
        PalettedImage pImage = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            is = filename.getClass().getResourceAsStream(filename);
            if (is == null) {//創(chuàng)建不成功
                throw new IllegalArgumentException();
            }
            baos = new ByteArrayOutputStream();
            int ch = 0;
            while ((ch = is.read()) != -1) {
                baos.write(ch);
            }

        }
        catch (IOException ioe) {
            throw ioe;
        }
        finally {
            if (baos != null) {
                try {
                    baos.close();
                }
                catch (IOException e) {
                }
            }
            if (is != null) {
                try {
                    is.close();
                }
                catch (IOException e) {
                }
            }
        }
        pImage = createPalettedImage(baos.toByteArray());
        return pImage;
    }

    /**
     * 取得生成的Image對(duì)象
     * 
     * @return Image對(duì)象
     */
    public Image getImage() {
        if (needRebuild) {
            rebuild();
        }
        return image;
    }

    /**
     * 設(shè)置調(diào)色板
     * 
     * @param colors
     *            調(diào)色板的所有顏色數(shù)組
     * @throws NullPointerException
     *             如果顏色數(shù)組為空
     * @throws IllegalArgumentException
     *             顏色數(shù)組長度和顏色個(gè)數(shù)不符
     */
    public void setPalette(int[] colors) {
        if (colors == null) {
            throw new NullPointerException();
        }
        if (colors.length != paletteColors) {//長度不符
            throw new IllegalArgumentException();
        }
        for (int i = 0, offset = paletteOffset; i < colors.length; i++, offset += 3) {
            imgData[offset] = (byte) ((colors[i] >> 16) & 0xff);
            imgData[offset + 1] = (byte) ((colors[i] >> 8) & 0xff);
            imgData[offset + 2] = (byte) ((colors[i]) & 0xff);
        }
        needRebuild = true;
    }

    /**
     * 取得調(diào)色板的顏色數(shù)
     * 
     * @return 顏色數(shù)
     */
    public int getColorCount() {
        return paletteColors;
    }

    /**
     * 設(shè)置某種顏色
     * 
     * @param index
     *            顏色索引號(hào)
     * @param color
     *            新的顏色值,以0xRRGGBB的格式
     * @throws IllegalArgumentException
     *             當(dāng)索引號(hào)不在范圍內(nèi)時(shí)
     */
    public void setColor(int index, int color) {
        if (index < 0 || index >= paletteColors) {
            throw new IllegalArgumentException();
        }
        int offset = paletteOffset + index * 3;
        imgData[offset] = (byte) ((color >> 16) & 0xff);
        imgData[offset + 1] = (byte) ((color >> 8) & 0xff);
        imgData[offset + 2] = (byte) ((color) & 0xff);
        needRebuild = true;
    }

    /**
     * 替換某種顏色
     * 
     * @param oldColor
     *            要替換的顏色值,0xRRGGBB格式
     * @param newColor
     *            新的顏色值,0xRRGGBB格式
     */
    public void replaceColor(int oldColor, int newColor) {
        byte rr = (byte) ((oldColor >> 16) & 0xff);
        byte gg = (byte) ((oldColor >> 8) & 0xff);
        byte bb = (byte) (oldColor & 0xff);
        for (int i = 0, offset = paletteOffset; i < paletteColors; i++, offset += 3) {
            if (rr == imgData[offset] && gg == imgData[offset + 1]
                    && bb == imgData[offset + 2]) {//找到
                imgData[offset] = (byte) ((newColor >> 16) & 0xff);
                imgData[offset + 1] = (byte) ((newColor >> 8) & 0xff);
                imgData[offset + 2] = (byte) (newColor & 0xff);
                needRebuild = true;
                break;
            }
        }
    }

    /**
     * 取得調(diào)色板顏色
     * 
     * @param index
     *            顏色索引號(hào)
     * @return int形式的顏色值
     * @throws IllegalArgumentException
     *             當(dāng)索引號(hào)不在范圍內(nèi)時(shí)
     */
    public int getColor(int index) {
        if (index < 0 || index >= paletteColors) {
            throw new IllegalArgumentException();
        }
        int offset = paletteOffset + index * 3;
        return ((imgData[offset] & 0xFF) << 16)
                | ((imgData[offset + 1] & 0xFF) << 8)
                | (imgData[offset + 2] & 0xFF);
    }

    private void rebuild() {//根據(jù)新的字節(jié)數(shù)據(jù)重建Image
        CRCChecksum();//重新計(jì)算校驗(yàn)和
        image = Image.createImage(imgData, 0, imgData.length);
        needRebuild = false;
        System.gc();
    }

    private void analyze() {//分析調(diào)色板相關(guān)資料
        int offset = 8;//跳過8字節(jié)的PNG頭,遍歷每個(gè)塊
        int chunkLen = 0;
        while (imgData[offset + 4] != 0x50 || imgData[offset + 5] != 0x4c
                || imgData[offset + 6] != 0x54 || imgData[offset + 7] != 0x45) {//offset指向的塊名稱不是PLTE
            chunkLen = readInt(offset);
            offset += (4 + 4 + chunkLen + 4);
        }
        chunkLen = readInt(offset);//塊長
        paletteColors = chunkLen / 3;//顏色數(shù)
        paletteOffset = offset + 8;//調(diào)色板偏移量
        CRCOffset = offset + 8 + chunkLen;//CRC校驗(yàn)碼偏移量
    }

    private int readInt(int offset) {//讀一個(gè)int
        return ((imgData[offset] & 0xFF) << 24)
                | ((imgData[offset + 1] & 0xFF) << 16)
                | ((imgData[offset + 2] & 0xFF) << 8)
                | (imgData[offset + 3] & 0xFF);
    }

    private void CRCChecksum() {//求得新的校驗(yàn)和
        int checksum = CRCUtil.checksum(imgData, paletteOffset - 4,
                paletteColors * 3 + 4);
        imgData[CRCOffset] = (byte) ((checksum >> 24) & 0xff);
        imgData[CRCOffset + 1] = (byte) ((checksum >> 16) & 0xff);
        imgData[CRCOffset + 2] = (byte) ((checksum >> 8) & 0xff);
        imgData[CRCOffset + 3] = (byte) ((checksum) & 0xff);
    }
}

final class CRCUtil {

    private static int[] crc_table;//CRC 表

    private static void make_crc_table() {
        int c;
        int n, k;
        crc_table = new int[256];
        for (n = 0; n < 256; n++) {
            c = n;
            for (k = 0; k < 8; k++) {
                if ((c & 1) == 1)
                    c = 0xedb88320 ^ (c >>> 1);
                else
                    c = c >>> 1;
            }
            crc_table[n] = c;
        }
    }

    private static int update_crc(byte[] buf, int off, int len) {
        int c = 0xffffffff;
        int n;

        if (crc_table == null) {
            make_crc_table();
        }
        for (n = off; n < len + off; n++) {
            c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >>> 8);
        }
        return c;
    }

    static int checksum(byte[] buf, int off, int len) {
        return update_crc(buf, off, len) ^ 0xffffffff;
    }

    CRCUtil() {
    }
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久五月婷婷| 欧美精品久久久久久久多人混战| 另类小说图片综合网| 亚洲成人中文在线| 亚洲国产精品影院| 午夜在线成人av| 美女网站在线免费欧美精品| 免费xxxx性欧美18vr| 狠狠色狠狠色合久久伊人| 久久成人免费网站| 国产盗摄一区二区| eeuss鲁片一区二区三区在线观看| 成人av在线影院| 99久久99久久久精品齐齐| 日本道免费精品一区二区三区| 99re成人在线| 欧美日韩精品高清| 欧美不卡激情三级在线观看| 国产亚洲女人久久久久毛片| 国产精品传媒视频| 亚洲成人免费电影| 精品亚洲免费视频| 99视频超级精品| 欧美午夜精品一区| 精品卡一卡二卡三卡四在线| 日本一二三四高清不卡| 亚洲精品日产精品乱码不卡| 免费成人你懂的| 成人av资源在线| 欧美一区二区三区男人的天堂| 久久久夜色精品亚洲| 亚洲男人天堂av| 看片网站欧美日韩| 91丨porny丨最新| 精品日韩成人av| 亚洲免费观看高清完整版在线| 午夜电影一区二区| 成人免费视频一区二区| 欧美日韩国产在线播放网站| 欧美激情一区三区| 午夜精品福利在线| 成人深夜福利app| 日韩一区二区不卡| 亚洲影院免费观看| 成人国产在线观看| 日韩久久久久久| 亚洲综合图片区| 成人高清免费观看| 欧美一级国产精品| 亚洲一区日韩精品中文字幕| 国产成人一区在线| 欧美电影免费观看高清完整版在 | 国产精品免费aⅴ片在线观看| 午夜久久久久久电影| 成人av在线一区二区| 精品成人在线观看| 日韩二区三区四区| 欧美日韩激情一区二区三区| 中文字幕一区视频| 风间由美一区二区三区在线观看| 欧美一区二区三区啪啪| 亚洲福利一区二区三区| 91蜜桃在线免费视频| 国产蜜臀av在线一区二区三区| 日韩不卡手机在线v区| 欧美日韩电影在线| 亚洲自拍偷拍av| 欧美日韩中文字幕一区二区| 亚洲视频免费看| www.爱久久.com| 日韩一区在线播放| 91网页版在线| 亚洲柠檬福利资源导航| 色素色在线综合| 亚洲免费观看在线视频| 91丨porny丨国产| 亚洲精品老司机| 欧美三级乱人伦电影| 亚洲激情男女视频| 在线看国产一区| 亚洲地区一二三色| 欧美顶级少妇做爰| 精品伊人久久久久7777人| 精品乱码亚洲一区二区不卡| 国产精品资源在线| 国产精品第五页| 一本久久a久久精品亚洲| 一区2区3区在线看| 欧美日韩国产首页| 蜜桃视频在线一区| 国产日韩欧美精品在线| 99久久99久久免费精品蜜臀| 亚洲国产日韩综合久久精品| 欧美一级高清片| 韩国在线一区二区| 国产精品乱码久久久久久 | 亚洲激情校园春色| 欧美三级电影在线看| 日本欧美一区二区三区乱码| 精品美女一区二区| 99久久久久久| 天天操天天干天天综合网| 精品日韩99亚洲| 91社区在线播放| 日本大胆欧美人术艺术动态| 国产亚洲一区二区三区在线观看 | 日韩成人av影视| 久久久久久久久蜜桃| 91女人视频在线观看| 日韩中文字幕91| 国产欧美一二三区| 欧美日韩精品久久久| 丰满亚洲少妇av| 婷婷综合另类小说色区| 国产欧美一区二区精品性色超碰 | 91亚洲永久精品| 麻豆91在线播放| 亚洲精品乱码久久久久久黑人| 欧美成人猛片aaaaaaa| 91日韩精品一区| 国产制服丝袜一区| 午夜一区二区三区视频| 国产精品美女久久久久久久网站| 91精选在线观看| 色综合视频在线观看| 国产iv一区二区三区| 理论片日本一区| 亚洲一区二区不卡免费| 国产精品久久久久久亚洲伦| 精品国精品国产尤物美女| 欧洲国产伦久久久久久久| 国产盗摄精品一区二区三区在线| 日本中文字幕一区二区视频| 亚洲免费在线看| 自拍偷在线精品自拍偷无码专区| 2020国产精品自拍| 日韩一区二区视频| 69久久99精品久久久久婷婷 | 粉嫩久久99精品久久久久久夜| 丝袜美腿亚洲综合| 亚洲成在人线免费| 亚洲人成在线播放网站岛国 | 亚洲欧美偷拍另类a∨色屁股| 久久综合成人精品亚洲另类欧美 | 久久99国产精品久久99果冻传媒| 一区二区三区在线视频观看58| 中文子幕无线码一区tr| 久久久久久久综合色一本| 精品美女在线播放| 久久亚洲综合色| 精品国产三级a在线观看| 日韩精品中文字幕在线不卡尤物 | 亚洲综合久久av| 亚洲欧美日韩在线播放| 亚洲人亚洲人成电影网站色| 日韩美女久久久| 一区二区三区美女| 亚洲成人精品一区| 日韩电影免费一区| 久久精品国产亚洲高清剧情介绍 | 欧美日韩成人综合天天影院| 在线观看日韩国产| 欧美日韩不卡一区二区| 欧美日韩精品欧美日韩精品| 91精品国产色综合久久ai换脸| 8v天堂国产在线一区二区| 欧美一级日韩免费不卡| 欧美va亚洲va在线观看蝴蝶网| 精品国产1区二区| 久久精品亚洲麻豆av一区二区| 国产日韩欧美不卡在线| 亚洲欧洲日韩av| 夜夜亚洲天天久久| 丝袜美腿成人在线| 国产美女久久久久| 成人99免费视频| 精品视频在线免费看| 日韩欧美自拍偷拍| 国产清纯在线一区二区www| **性色生活片久久毛片| 亚洲成人av福利| 国产剧情一区二区| 色哟哟日韩精品| 欧美成人一区二区| 亚洲免费观看高清| 麻豆精品国产传媒mv男同| 国产**成人网毛片九色| 色av成人天堂桃色av| 日韩精品一区二区三区视频 | 精品成人私密视频| 亚洲图片欧美激情| 精品一区二区三区欧美| 91片在线免费观看| 久久色在线观看| 亚洲国产日韩精品| 成人小视频在线| 91精品中文字幕一区二区三区| 国产嫩草影院久久久久| 免费的国产精品| 在线精品亚洲一区二区不卡|