2010-02-14 7 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

1

검은 색을 검색하는 이미지 RGB를 구문 분석하고 원하는 색으로 대체 할 수 있습니다.

+0

다음 게시물에 다음 구현에서 찾을 수 있습니다. –

+0

당신은 환영 받고 좋은 구현입니다. –

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

오프셋을 증가시키는 이유를 설명 할 수 있습니까? 오프셋 매개 변수의 목적은 무엇입니까? –

+0

'offset'은 파일의 현재 위치에 불과합니다. 스트림을 읽고 현재 위치의 배열에 씁니다. 하지만이 코드는 3 살입니다. 이제는 전체 파일을 배열로 읽은 다음이 배열을 편집하는 것이 더 나을 것 같습니다. :) –

관련 문제