`
hu1010
  • 浏览: 23804 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

使用调色板修改png图片

阅读更多

这个算法是参考一位高人的文章,直接读取并修改png格式图片的调色板,然后生成新的调色板替代原来的。
这样可以实现游戏中常见的变色效果,可以解决游戏容量有限,不能存放太多精灵图片的问题。

具体过程其实并不复杂,大家可以先搜索资料,先看看png图片的格式定义。这个算法正是找到调色板区,根据原有格式修改之后,生成新的crc校验码,然后替换原来的调色板。这样就可以用一个png图片,创建多个变色副本。

public class PalettedImage {
 
    public Image getPalettedImage(byte[] data, int[] originalColors,
                                  int[] palettedColors) {
        byte[] tempData = new byte[data.length];
        System.arraycopy(data, 0, tempData, 0, data.length);
        Image img = null;
        int[] parameter = {0, 0, 0};
        analyze(tempData, parameter);
        for (int i = 0; i < originalColors.length; i++) {
            replaceColor(tempData, parameter, originalColors[i],
                         palettedColors[i]);
        }
        fillData(tempData, parameter);
        try {
            img = Image.createImage(tempData, 0, data.length);
        } catch (Exception e) {
            System.out.println("getPalettedImage  &&  " + e.toString());
        }
        return img;
    }
 
    private void analyze(byte[] data, int[] para) {
        int offset = 8;
        int chunkLen = 0;
        while (data[offset + 4] != 0x50 || data[offset + 5] != 0x4c
               || data[offset + 6] != 0x54 || data[offset + 7] != 0x45) {
            chunkLen = readInt(data, offset);
            offset += (4 + 4 + chunkLen + 4);
        }
        chunkLen = readInt(data, offset);
        para[2] = chunkLen / 3;
        para[0] = offset + 8;
        para[1] = offset + 8 + chunkLen;
    }
 
    private int readInt(byte[] data, int offset) {
        return ((data[offset] & 0xFF) << 24)
                | ((data[offset + 1] & 0xFF) << 16)
                | ((data[offset + 2] & 0xFF) << 8) | (data[offset + 3] & 0xFF);
    }
 
    private void replaceColor(byte[] data, int[] para, 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 = para[0], temp = 0; i < para[2]; i++,
                                                 offset += 3) {
            if (rr == data[offset] && gg == data[offset + 1]
                && bb == data[offset + 2]) {
                data[offset] = (byte) ((newColor >> 16) & 0xff);
                data[offset + 1] = (byte) ((newColor >> 8) & 0xff);
                data[offset + 2] = (byte) (newColor & 0xff);
                break;
            }
        }
    }
 
    private void fillData(byte[] data, int[] para) {
        int checksum = update_crc(data, para[0] - 4, para[2] * 3 + 4);
        data[para[1]] = (byte) ((checksum >> 24) & 0xff);
        data[para[1] + 1] = (byte) ((checksum >> 16) & 0xff);
        data[para[1] + 2] = (byte) ((checksum >> 8) & 0xff);
        data[para[1] + 3] = (byte) ((checksum) & 0xff);
    }
 
    private int update_crc(byte[] buf, int off, int len) {
        int c = 0xffffffff;
        int n, k;
        int xx;
        int[] crc_table = new int[256];
        for (n = 0; n < 256; n++) {
            xx = n;
            for (k = 0; k < 8; k++) {
                if ((xx & 1) == 1) {
                    xx = 0xedb88320 ^ (xx >>> 1);
                } else {
                    xx = xx >>> 1;
                }
            }
            crc_table[n] = xx;
        }
 
        for (n = off; n < len + off; n++) {
            c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >>> 8);
        }
        return (c ^ 0xffffffff);
    }
 
}

 接口就是getPalettedImage()函数,只需要输入原始图片的byte数组,以及需要替换颜色的颜色值还有目标颜色值就行了。因为可以同时替换多个颜色,所以输入参数是代表颜色的整形的数组。总之,要保证原始颜色与目标颜色一一对应就好了。方法简单实用。

分享到:
评论

相关推荐

    java 替换图片颜色 修改PNG图片颜色

    将图片加载到内存 循环图片每个像素 找到你需要修改的像素 进行颜色修改。然后再图片BASE64

    Png图片换色的方法

    Png图片换色的方法是指对Png格式图片进行颜色修改的过程。该方法主要应用于索引类型的图片,即包含PLTE调色板的Png图片。通过修改调色板和使用CRC算法生成新的验证码,可以实现图片颜色的改变。 Png图片换色的方法...

    PNG转8位深度

    在PNG图像中,位深度决定了颜色调色板的大小。例如,一个8位的PNG图像可以有256种不同的颜色,因为2的8次方等于256。这适用于所有通道,包括红、绿、蓝(RGB)和可能存在的透明度通道(阿尔法通道)。当将高位深度的...

    ICO_PNG图标文件2

    ICO 和 PNG 文件是两种常见的图像格式,它们在IT领域中有着广泛的应用,特别是在网页设计、软件开发和系统图标设计中。下面将详细解释这两种格式的特点、用途以及如何处理它们。 ICO 文件是一种特殊的图像文件格式...

    jquery调色板插件

    5. **wheel.png, mask.png, marker.png**:这些都是图片资源文件,用于构建调色板的视觉元素。`wheel.png` 是颜色轮的图像,`mask.png` 可能是用来遮罩颜色轮的一部分,`marker.png` 则可能是用来标记当前选中的颜色...

    PNG图像数据结构详细介绍

    PNG允许添加可选的信息块,如`gAMA`(gamma校正)、`cHRM`(色彩空间XYZ坐标)、`bKGD`(背景色)、`tIME`(文件修改时间)、`pHYs`(物理像素尺寸)等,这些提供了更丰富的元数据。 理解PNG的这些数据结构对于...

    PNG图像文件格式解析

    - **网页设计**:PNG文件适用于网页图标、按钮和背景图片。 - **游戏开发**:在游戏行业中,PNG格式常用于角色和环境的纹理。 - **图形用户界面**:PNG格式非常适合GUI元素,如图标和菜单。 - **科学可视化**:在...

    PNG图片数据格式.PDF

    PNG图片数据格式详解 PNG(Portable Network Graphics)是一种广泛用于互联网上的无损压缩位图图形格式,支持透明度。PNG格式的设计目标是为了替代GIF和TIFF格式,同时避免专利限制,提供更好的图像质量和压缩效率...

    C#处理png图片位深度和交错属性

    在C#中,虽然.NET框架不直接提供修改PNG交错属性的API,但可以通过第三方库如libpng.NET或SharpPng等实现。这些库允许我们控制PNG的编码参数,包括是否启用Adam7交错。 综上所述,处理PNG图像的位深度和交错属性在...

    html5上传图片编辑滤镜调色效果

    例如,我们可以使用`getImageData()`和`putImageData()`方法获取和修改像素数据,实现各种滤镜效果。比如,灰度滤镜可以通过将每个像素的红绿蓝通道值设为平均值来实现: ```javascript function applyGrayscale...

    bmp,jpg,png,gif图像相互转换

    GIF采用无损压缩,但只支持256色的调色板,适合简单的图形和图标。动态GIF是通过合并多个帧来创建动画效果,广泛应用于互联网上的动图。 实现这四种格式之间的转换,通常需要借助图像处理软件或编程库。例如,...

    日历PNG图标下载

    日历图标通常使用蓝色或灰色,因为这些颜色与专业和时间管理相关联,但也可以根据品牌调色板进行调整。 4. **尺寸适应性**:由于PNG图标可能在不同大小的屏幕上使用,设计师需要确保图标在小尺寸下仍能清晰识别,不...

    图标制作和修改工具专业版

    图标制作和修改工具专业版,如“AWicons Pro”,是一款专为设计师和开发者设计的强大软件,用于创建、编辑以及转换图标。它具有丰富的功能,能够满足用户在图标设计过程中的各种需求,无论你是想从头开始创建全新的...

    图标制作 修改 工具 图标制作工具

    1. **多种格式支持**:这些工具能够处理多种图标格式,如ICO、PNG、ICNS、SVG等,确保图标可以在不同平台和设备上使用。 2. **绘图工具**:提供画笔、形状、渐变、填充、橡皮擦等基本绘图工具,让用户可以自由创作...

    GIF图片大小修改器

    因此,"GIF图片大小修改器"工具应运而生,旨在帮助用户根据需求调整GIF的尺寸,以优化其在网络上的表现。 GIF图片修改涉及到几个关键概念: 1. **压缩算法**:GIF使用的是LZW(Lempel-Ziv-Welch)无损压缩算法,该...

    WPF 修改图片颜色 2.5

    "WPF 修改图片颜色 2.5"这个标题可能指的是一个教程或工具,它展示了如何利用WPF框架来改变图片的颜色。这种功能可以用于创建滤镜效果、调整图像色调或者实现色彩校正等。 在WPF中,我们可以利用`WriteableBitmap`...

    PNG文件结构分析之一.docx

    在J2ME(Java 2 Micro Edition)的MIDP1.0平台上,PNG图片的使用受到一定限制,如不支持交错方法(Adam7隔行扫描),通常要求非隔行扫描的PNG图像。此外,对于颜色类型,MIDP1.0仅支持索引彩色图像(1、2、4或8位)...

    gif图片大小绿色修改器

    1. **下载与运行**:首先,从可靠的源获取" GIF图片大小修改器"的绿色版,无需安装,双击即可运行。 2. **导入GIF**:打开软件后,选择需要修改的GIF图片文件,点击“打开”按钮将其导入到软件中。 3. **设置参数*...

    编程使用精美小图标、ico图标、gif图标

    4. **动态处理**:在JavaScript中,可以使用DOM操作动态改变gif图标的显示,例如通过修改`src`属性实现动画的暂停和播放。 总结来说,ico和gif图标在编程中扮演着提升用户体验和增强视觉效果的角色。ico图标作为...

    pngnq-s9:修改后的 pngnq:将 png 图像转换为 256 色。-开源

    pngnq-s9 是 pngnq 的修改版本,pngnq 是用于 png 图像的神经网络颜色量化器。 与 pngnq 一样,pngnq-s9 获取完整的 32 位 RGBA png 图像,选择最多 256 种颜色的调色板,然后以 8 位索引模式重新绘制图像。 生成的...

Global site tag (gtag.js) - Google Analytics