質問

私はプログラム的に好きな色に、この画像では「黒描画色」を変更することができるか、黒と透明の背景とその中の描画と.PNGイメージを持っています。リム4.5 APIを使用していますか? 事前のおかげで....

役に立ちましたか?

解決

私は解決策を見つけ、ここではそれが興味を持っている人のためのものです。

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;
}

他のヒント

あなたは黒い色を探して画像RGBSを解析し、あなたが望むものは何でも色に置き換えることができます。

あなたはバイト配列および編集パレットチャンクにあなたの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);
        }
    }

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top