这个算法是参考一位高人的文章,直接读取并修改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数组,以及需要替换颜色的颜色值还有目标颜色值就行了。因为可以同时替换多个颜色,所以输入参数是代表颜色的整形的数组。总之,要保证原始颜色与目标颜色一一对应就好了。方法简单实用。
发表评论
-
老外写的 StringTool
2009-10-26 16:22 1060/* * StringTool.java * * ... -
网络图片资源处理
2009-09-29 13:22 823编程中往往不仅需要处理本地的图片资源,还要处理网络中获取 ... -
J2ME Effects Library
2009-09-28 15:42 970J2ME ARMY KNIFE is, as far as I ... -
j2me中的MIDlet类说明
2009-09-28 13:14 1452在J2ME编程过程中,MIDlet ... -
J2ME入门体会
2009-09-28 13:13 792学习J2ME已经有几天的时间了,今天我以一个初学者的角度来谈谈 ... -
j2me进度条Gauge模板
2009-09-28 13:11 1431这是很好的进度条的模板,里面涉及丰富的Java知识,值得很好研 ... -
SimpleCache
2009-09-28 12:39 790public class SimpleCache { ... -
StringTokenizer
2009-09-28 12:36 846public class StringTokenizer { ... -
编码技巧
2009-09-22 11:56 7271. 用StringBuffer ... -
混淆器
2009-09-22 10:49 989ProGuard - ... -
j2me游戏中使用记录管理系统
2009-09-22 10:32 571纪录管理系统(Record Ma ...
相关推荐
将图片加载到内存 循环图片每个像素 找到你需要修改的像素 进行颜色修改。然后再图片BASE64
Png图片换色的方法是指对Png格式图片进行颜色修改的过程。该方法主要应用于索引类型的图片,即包含PLTE调色板的Png图片。通过修改调色板和使用CRC算法生成新的验证码,可以实现图片颜色的改变。 Png图片换色的方法...
在PNG图像中,位深度决定了颜色调色板的大小。例如,一个8位的PNG图像可以有256种不同的颜色,因为2的8次方等于256。这适用于所有通道,包括红、绿、蓝(RGB)和可能存在的透明度通道(阿尔法通道)。当将高位深度的...
ICO 和 PNG 文件是两种常见的图像格式,它们在IT领域中有着广泛的应用,特别是在网页设计、软件开发和系统图标设计中。下面将详细解释这两种格式的特点、用途以及如何处理它们。 ICO 文件是一种特殊的图像文件格式...
5. **wheel.png, mask.png, marker.png**:这些都是图片资源文件,用于构建调色板的视觉元素。`wheel.png` 是颜色轮的图像,`mask.png` 可能是用来遮罩颜色轮的一部分,`marker.png` 则可能是用来标记当前选中的颜色...
PNG允许添加可选的信息块,如`gAMA`(gamma校正)、`cHRM`(色彩空间XYZ坐标)、`bKGD`(背景色)、`tIME`(文件修改时间)、`pHYs`(物理像素尺寸)等,这些提供了更丰富的元数据。 理解PNG的这些数据结构对于...
- **网页设计**:PNG文件适用于网页图标、按钮和背景图片。 - **游戏开发**:在游戏行业中,PNG格式常用于角色和环境的纹理。 - **图形用户界面**:PNG格式非常适合GUI元素,如图标和菜单。 - **科学可视化**:在...
PNG图片数据格式详解 PNG(Portable Network Graphics)是一种广泛用于互联网上的无损压缩位图图形格式,支持透明度。PNG格式的设计目标是为了替代GIF和TIFF格式,同时避免专利限制,提供更好的图像质量和压缩效率...
在C#中,虽然.NET框架不直接提供修改PNG交错属性的API,但可以通过第三方库如libpng.NET或SharpPng等实现。这些库允许我们控制PNG的编码参数,包括是否启用Adam7交错。 综上所述,处理PNG图像的位深度和交错属性在...
例如,我们可以使用`getImageData()`和`putImageData()`方法获取和修改像素数据,实现各种滤镜效果。比如,灰度滤镜可以通过将每个像素的红绿蓝通道值设为平均值来实现: ```javascript function applyGrayscale...
GIF采用无损压缩,但只支持256色的调色板,适合简单的图形和图标。动态GIF是通过合并多个帧来创建动画效果,广泛应用于互联网上的动图。 实现这四种格式之间的转换,通常需要借助图像处理软件或编程库。例如,...
日历图标通常使用蓝色或灰色,因为这些颜色与专业和时间管理相关联,但也可以根据品牌调色板进行调整。 4. **尺寸适应性**:由于PNG图标可能在不同大小的屏幕上使用,设计师需要确保图标在小尺寸下仍能清晰识别,不...
图标制作和修改工具专业版,如“AWicons Pro”,是一款专为设计师和开发者设计的强大软件,用于创建、编辑以及转换图标。它具有丰富的功能,能够满足用户在图标设计过程中的各种需求,无论你是想从头开始创建全新的...
“动态图片”一词通常指的是GIF格式的图像,但随着技术的发展,其他格式如WebP和APNG也逐渐加入了动态图片的家族。GIF以其独特的历史地位和广泛的兼容性,成为网络上使用最为频繁的动态图片格式。它在90年代初期问世...
"WPF 修改图片颜色 2.5"这个标题可能指的是一个教程或工具,它展示了如何利用WPF框架来改变图片的颜色。这种功能可以用于创建滤镜效果、调整图像色调或者实现色彩校正等。 在WPF中,我们可以利用`WriteableBitmap`...
1. **多种格式支持**:这些工具能够处理多种图标格式,如ICO、PNG、ICNS、SVG等,确保图标可以在不同平台和设备上使用。 2. **绘图工具**:提供画笔、形状、渐变、填充、橡皮擦等基本绘图工具,让用户可以自由创作...
因此,"GIF图片大小修改器"工具应运而生,旨在帮助用户根据需求调整GIF的尺寸,以优化其在网络上的表现。 GIF图片修改涉及到几个关键概念: 1. **压缩算法**:GIF使用的是LZW(Lempel-Ziv-Welch)无损压缩算法,该...
在J2ME(Java 2 Micro Edition)的MIDP1.0平台上,PNG图片的使用受到一定限制,如不支持交错方法(Adam7隔行扫描),通常要求非隔行扫描的PNG图像。此外,对于颜色类型,MIDP1.0仅支持索引彩色图像(1、2、4或8位)...
1. **下载与运行**:首先,从可靠的源获取" GIF图片大小修改器"的绿色版,无需安装,双击即可运行。 2. **导入GIF**:打开软件后,选择需要修改的GIF图片文件,点击“打开”按钮将其导入到软件中。 3. **设置参数*...
4. **动态处理**:在JavaScript中,可以使用DOM操作动态改变gif图标的显示,例如通过修改`src`属性实现动画的暂停和播放。 总结来说,ico和gif图标在编程中扮演着提升用户体验和增强视觉效果的角色。ico图标作为...