2010-02-14 111 views

回答

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

是的,它可以工作,但它不會改變任何顏色,甚至有點偏黑,這意味着任何別名的圖像最終都會看起來很醜。 – funkybro 2010-02-15 09:12:52

1

您可以解析圖像RGB搜索黑色,並用任何你想要的顏色取代它。

+0

謝謝阿里....在下一篇文章中,你會發現實現。 – 2010-02-14 10:14:38

+0

不客氣,而且很好的實現。 – 2010-02-14 10:48:42

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); 
     } 
    } 
 
+0

你能解釋爲什麼你增加了抵消?偏移參數的目的是什麼? – 2013-01-24 16:08:13

+0

'offset'只是文件中的當前位置 - 我們讀取流並將其寫入當前位置的數組。但是這段代碼已經3年了 - 現在看來,將整個文件讀入數組然後編輯這個數組會更好:) – 2013-01-24 16:21:13

相關問題