`
kalogen
  • 浏览: 880110 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Png图片换色的方法

    博客分类:
  • J2me
 
阅读更多

对于"索引类型的图片",即肯定包含PLTE调色板的Png图片,就可以通过对调色板的修改,再通过CRC算法生成新的验证码,再还原成新图片就可以得到所要的效果,为此,我写了如下的类.
 

/*  用于PNG图片变色的类  使用要求,需要美工将原始图片的需要换色的点  设置为纯红色0xff0000  */
import Java.io.*;
import java.lang.*;
import javax.microedition.lcdui.*;
 
public class coloredImage {
    public coloredImage() {
    }
 
    public Image getColoredImage(String s, int newcolor) {
        try {
            byte[] pixel;
            InputStream is = getClass().getResourceAsStream(s);
            int i = 0;
            while (is.read() != -1) {
                i++;
            }
            pixel = new byte[i];
            is = null;
            is = getClass().getResourceAsStream(s);
            is.read(pixel);
            imgConvert(pixel, newcolor);
            return (Image.createImage(pixel, 0, pixel.length));
        } catch (Exception e) {
            return null;
        }
    }
 
    public void imgConvert(byte content[], int color) {
        try {
            int start = 0;
            int newcolor = -1;
           for (int idx = 0; idx < content.length; idx++) {
                if (content[idx] == 0x50 && content[idx + 1] == 0x4c
                    && content[idx + 2] == 0x54 && content[idx + 3] == 0x45) {
                    start = idx;
                    break;
                }
            }            for (int idx = 0; idx < 4; idx++) {
                newcolor = pixelConvert(content[start + idx], newcolor);
            }
            int r, g, b, length;
            length = (content[start - 4] & 0xff << 24) |
                     (content[start - 3] & 0xff << 16) |
                     (content[start - 2] & 0xff << 8) |
                     (content[start - 1] & 0xff);
            for (int i = 0; i < length; i++) {
                r = content[start + 4 + i] & 0xff;
                g = content[start + 4 + i + 1] & 0xff;
                b = content[start + 4 + i + 2] & 0xff;
                if (r == 255 && g == 0 && b == 0) {
                    r = color >> 16 & 0xff;
                    g = color >> 8 & 0xff;
                    b = color & 0xff;
                    content[start + 4 + i] = (byte) r;
                    content[start + 4 + i + 1] = (byte) g;
                    content[start + 4 + i + 2] = (byte) b;
                }
                newcolor = pixelConvert(content[start + 4 + i], newcolor);
                newcolor = pixelConvert(content[start + 4 + i + 1], newcolor);
                newcolor = pixelConvert(content[start + 4 + i + 2], newcolor);
            }
            newcolor = ~newcolor;
            content[start + 4 + length] = (byte) (newcolor >> 24);
            content[start + 4 + length + 1] = (byte) (newcolor >> 16);
            content[start + 4 + length + 2] = (byte) (newcolor >> 8);
            content[start + 4 + length + 3] = (byte) (newcolor);
        } catch (Exception e) {}
    }
 
    /**      * CRC检验算法      * @param pixel 像素      * @param color 颜色值      * @return      */
    public int pixelConvert(byte pixel, int color) {
        int tmp = pixel & 0xff;
        color ^= tmp;
        for (int idx = 0; idx < 8; idx++) {
            if ((color & 1) != 0) {
                color = color >>> 1 ^ 0xedb88320;
            } else {
                color >>>= 1;
            }
        }
        return color;
    }
}这个类提供了一个转换图片颜色的方法getColoredImage,只要将源图片的路径以及需要转换的新颜色作为参数调用就可以得到转换后的图片.

相应的我把我的主类写出来供大家参考其用法. import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
import com.nokia.mid.UI.*;
import java.io.*;
 
public class pengzhuang extends MIDlet {
    class test extends FullCanvas {
        Image[] a;
        byte[] pix;
        coloredImage ci;
        public test() {
            ci = new coloredImage();
            a = new Image[4];
            a[0] = ci.getColoredImage("/char.png", 0x0000ff);
            a[1] = ci.getColoredImage("/char.png", 0x00ff00);
            a[2] = ci.getColoredImage("/char.png", 0xffffff);
            a[3] = ci.getColoredImage("/char.png", 0x00ffff);
        }
 
        public void keyPressed(int i) {
        }
 
        public void paint(Graphics g) {
            g.setColor(0xffffff);
            g.fillRect(0, 0, getWidth(), getHeight());
            g.drawImage(a[0], 0, 0, 0);
            g.drawImage(a[1], 30, 30, 0);
            g.drawImage(a[2], 60, 60, 0);
            g.drawImage(a[3], 90, 90, 0);
        }
    }
 
 
    private Display display;
    test t;
    public pengzhuang() {
        try {
            t = new test();
        } catch (Exception e) {
        }
        display = Display.getDisplay(this);
    }
 
    public void startApp() {
        display.setCurrent(t);
    }
 
    public void pauseApp() {
 
    }
 
    public void destroyApp(boolean boo) {
 
    }
}

其中用到的源图是

 

 



 Png图片换色的方法

 

 

运行程序后的效果为

 
 

 

  • 大小: 348 Bytes
  • 大小: 3.7 KB
分享到:
评论

相关推荐

    PNG图标互转换ICO工具

    PNG和ICO是两种常见的图像格式,分别用于不同的应用场景。PNG(Portable Network Graphics)是一种无损压缩...了解这种工具的使用方法和工作原理,有助于提高工作效率,确保图标在各种平台和环境中都能呈现出最佳效果。

    ICO和PNG图标相互转换生成软件,支持PNG格式和ICO格式的图标相互转换

    常见的图标格式有两种:ICO和PNG。ICO是Windows操作系统中的标准图标格式,它允许在一个文件中包含多个不同尺寸和颜色深度的图标,以适应不同的显示需求。PNG(Portable Network Graphics)则是一种无损压缩的位图...

    png图片批量转换jpg格式工具

    2. **添加文件**:在程序界面中,有一个“添加文件”或类似选项,用户可以通过这个功能将需要转换的PNG图片导入到软件中。 3. **选择输出目录**:转换后的JPG图片会保存在指定的输出目录下,用户应提前设置好这一...

    PNG图片转化为icon透明图标方法

    以下是关于“PNG图片转化为icon透明图标方法”的详细步骤和相关知识点: 一、PNG图片转化为ICON图标 1. 准备工作:首先,你需要一个PNG格式的图像,这种格式通常具有透明背景,适用于制作图标。 2. 使用在线转换...

    PNG图片转ISO图标.zip

    总之,PNG图片转ISO图标.zip文件包为用户提供了自制个性化图标的方法,通过将PNG图像转换为Windows系统的ICO格式,可以将这些图标应用于各种系统元素,增加系统的视觉吸引力和个性化程度。如果你是一个喜欢自定义...

    将png格式图片转换成YUV格式,C++

    总结来说,将PNG图片转换为YUV格式涉及图像读取、颜色空间转换、处理Alpha通道(如果存在)、存储YUV数据以及输出YUV文件等多个步骤。C++通过利用libpng和OpenCV等库,可以高效地完成这个过程。了解并实践这一转换,...

    MatLab 批量将24位PNG彩图转换为8位PNG彩图

    通常,24位PNG图像具有丰富的色彩,能够表示超过1600万种颜色,而8位PNG图像只能表示256种颜色。在某些情况下,如存储空间限制、网页优化或者特定应用需求,可能需要将24位PNG图像转换为8位PNG图像。在本教程中,...

    PNG图标图片大全

    在“PNG图标图片大全”这个压缩包中,包含超过2000张PNG格式的图标,这些图标设计用于移动开发和网站开发。这意味着它们涵盖了各种常见的功能和类别,例如设置、导航、社交、信息提示、购物、媒体控制等。在移动应用...

    java+png透明图片处理方法

    以下是一些关于如何在Java中处理PNG图片透明度的关键知识点: 1. **Java图像库**: Java标准库提供了`java.awt`和`javax.imageio`包,用于读取、写入和操作图像。例如,`BufferedImage`类是处理图像的主要类,它支持...

    PNG图片转换成BMP图片格式

    这个"PNG图片转换工具"正是为此目的而设计的。 PNG是一种无损压缩的图像格式,支持透明度和24位色彩,广泛用于网页设计和数字图像处理。其优点在于它能保持图像质量不降低,尤其是在处理有大量透明或半透明像素的...

    PNG ICO 格式转换软件

    使用这样的工具,用户可以直接将一批PNG图片批量转换为ICO格式,省去了手动调整和转换的麻烦。 转换ICO到PNG的过程中,主要关注点在于保持图像质量和尽可能还原原始的透明效果。由于ICO文件中可能包含多种尺寸的...

    png批量转换ico

    然而,由于某些平台或功能需求,可能需要将PNG图片转换为ICO格式。 批量转换的过程大大提高了效率,特别是在处理大量图像时。传统的单个文件转换方法不仅耗时,而且繁琐。通过批量转换工具,用户可以一次性选择多个...

    png图片转换图标工具

    这就是"png图片转换图标工具"如ToYcon存在的原因。 ToYcon是一款小巧但功能强大的图形转换软件,专门用于将PNG图像文件转换成ICO图标。它的主要优点在于其易用性,用户只需简单地通过鼠标拖放操作就能完成转换,极...

    解决IE6下PNG图片背景色不透明问题的方法

    本文将详细介绍如何解决IE6下的PNG图片背景色不透明问题。 首先,理解问题的原因至关重要。IE6不完全支持PNG8和PNG24这两种PNG格式。特别是PNG24,它包含了24位颜色和一个alpha通道,用于实现半透明效果,但IE6只能...

    png图片自动转换ico图标

    本压缩包提供了一个名为"PNG to ICO"的程序,专门用于将PNG图片自动转换为ICO图标。这个程序简化了手动转换的过程,使得用户只需将待转换的PNG图片放入指定的"PNG文件夹"下,然后运行"SETUP.DAT"文件,转换完成后,...

    各种PNG图标下载

    这种设计使得图标可以无缝融入各种背景,无论背景是单一颜色、渐变色,还是复杂的图像,都能保持良好的视觉效果。 总的来说,这个PNG图标集合是一个宝贵的资源库,对于从事网站开发、软件界面设计或者需要图标素材...

    任意图片转8位(256色)png图片工具(win平台命令行)

    标题中的“任意图片转8位(256色)png图片工具”指的是一个软件或程序,它能够将各种格式的图像文件转换成8位色彩深度的PNG图片。8位PNG图片意味着每个像素由8个二进制位表示,总共可以表示256种颜色,这种格式常用于...

    PNG图标包2100个

    1. **无损压缩**:PNG采用了一种基于预测和差分编码的无损压缩算法,这意味着图片在压缩后可以完全恢复到原始状态,不会丢失任何细节。 2. **透明支持**:PNG支持透明度,可以创建半透明或完全透明的图像,这对于...

Global site tag (gtag.js) - Google Analytics