如何以编程方式更改图像中的颜色?

时间:2010-02-14 08:35:29

标签: blackberry java-me colors rim-4.5 blackberry-os-v4.5

我有一个带有透明背景的图片.PNG图片和带有黑色的图片,我怎样才能将此图片中的“黑色绘图颜色”更改为我想要的任何编程颜色;使用rim 4.5 API? 感谢提前......

3 个答案:

答案 0 :(得分:2)

我找到了解决方案,这里是有兴趣的人。

Bitmap colorImage(Bitmap image, int color) {
    int[] rgbData= new int[image.getWidth() * image.getHeight()];
    image.getARGB(rgbData, 
                  0, 
                  image.getWidth(), 
                  0, 
                  0, 
                  image.getWidth(), 
                  image.getHeight());
    for (int i = 0; i < rgbData.length; i++) {
        int alpha = 0xFF000000 & rgbData[i];
        if((rgbData[i] & 0x00FFFFFF) == 0x00000000)
            rgbData[i]= alpha | color;
    }
    image.setARGB(rgbData,
                  0, 
                  image.getWidth(),
                  0,
                  0,
                  image.getWidth(),
                  image.getHeight());
    return image;
}

答案 1 :(得分:1)

您可以解析搜索黑色的图像RGB,并将其替换为您想要的任何颜色。

答案 2 :(得分:1)

您可以将PNG图像读取为字节数组并编辑调色板块。 此方法仅适用于PNG-8图像。 这是我的代码:


public static Image createImage(String filename) throws Throwable
    {
        DataInputStream dis = null;
        InputStream is = null;

        try {
            is = new Object().getClass().getResourceAsStream(filename);
            dis = new DataInputStream(is);

            int pngLength = dis.available();
            byte[] png = new byte[pngLength];
            int offset = 0;
            dis.read(png, offset, 4);   offset += 4;    //‰PNG  
            dis.read(png, offset, 4);   offset += 4;    //....
            while (true) {
                //length
                dis.read(png, offset, 4);   offset += 4;
                int length = (png[offset-1]&0xFF) | ((png[offset-2]&0xFF)<<8) | ((png[offset-3]&0xFF)<<16) | ((png[offset-4]&0xFF)<<24);
                //chunk type
                dis.read(png, offset, 4);   offset += 4;
                int type = (png[offset-1]&0xFF) | ((png[offset-2]&0xFF)<<8) | ((png[offset-3]&0xFF)<<16) | ((png[offset-4]&0xFF)<<24);

                //chunk data
                for (int i=0; i<length; i++) {
                    dis.read(png, offset, 1);   offset += 1;
                }
                //CRC
                dis.read(png, offset, 4);   offset += 4;
                int crc = (png[offset-1]&0xFF) | ((png[offset-2]&0xFF)<<8) | ((png[offset-3]&0xFF)<<16) | ((png[offset-4]&0xFF)<<24);

                if (type == 0x504C5445) {   //'PLTE'
                    int CRCStart = offset-4;
                    int PLTEStart = offset-4-length;

                    //modify PLTE chunk
                    for (int i=PLTEStart; i<PLTEStart+length; i+=3) {
                        png[i+0] = ...
                        png[i+1] = ...
                        png[i+2] = ...
                    }

                    int newCRC = crc(png, PLTEStart-4, length+4);
                    png[CRCStart+0] = (byte)(newCRC>>24);
                    png[CRCStart+1] = (byte)(newCRC>>16);
                    png[CRCStart+2] = (byte)(newCRC>>8);
                    png[CRCStart+3] = (byte)(newCRC);

                }
                if (offset >= pngLength)
                    break;
            }

            return Image.createImage(png, 0, pngLength);
        } catch (Throwable e) {
            throw e;
        } finally {
            MainCanvas.closeInputStream(dis);
            MainCanvas.closeInputStream(is);
        }
    }