2010-11-22 1 views
1

색상을 적용 할 일부 png 파일이 있습니다. 사용자 선택에 따라 색상이 바뀝니다. 다른 방법으로 설정된 3 개의 RGB 값을 통해 색상을 변경합니다. png 파일은 모양 외부의 완전한 투명도를 가진 임의의 모양입니다. 나는 투명도를 수정하고 싶지 않고 오직 RGB 값만을 수정하고 싶다. 현재 픽셀 단위로 RGB 값을 설정하고 있습니다 (아래 코드 참조).픽셀 단위 대신 (PNG) 비트 맵 색상을 설정하는 더 빠른 방법

저는 이것이 매우 느리고 응용 프로그램에서 충분히 효율적이지 않을 수 있음을 알게되었습니다. 내가 할 수있는 더 좋은 방법이 있니?

내가 현재하고있는 일은 다음과 같습니다.

public void foo(Component component, ComponentColor compColor, int userColor) { 
    int h = component.getImages().getHeight(); 
    int w = component.getImages().getWidth(); 
    mBitmap = component.getImages().createScaledBitmap(component.getImages(), w, h, true); 

    int[] pixels = new int[h * w]; 

    //Get all the pixels from the image 
    mBitmap[index].getPixels(pixels, 0, w, 0, 0, w, h); 

    //Modify the pixel array to the color the user selected 
    pixels = changeColor(compColor, pixels); 

    //Set the image to use the new pixel array 
    mBitmap[index].setPixels(pixels, 0, w, 0, 0, w, h); 
} 

public int[] changeColor(ComponentColor compColor, int[] pixels) { 
    int red = compColor.getRed(); 
    int green = compColor.getGreen(); 
    int blue = compColor.getBlue(); 
    int alpha; 

    for (int i=0; i < pixels.length; i++) { 
     alpha = Color.alpha(pixels[i]); 
     if (alpha != 0) { 
      pixels[i] = Color.argb(alpha, red, green, blue); 
     } 
    } 
    return pixels; 
} 
+1

아마도 당신은 팔레트 이미지를 사용할 수있는 즉? 모든 색상에 하나의 색상을 사용하기 때문에 RGB 성분이 동일하고 A 부분 만 달라지기 때문에 하나의 입력에서 256 개의 가능한 픽셀 색상을 얻을 수 있음을 의미합니다. 이미지에 256 색의 팔레트가 있고 알파 채널의 값이 다른 경우에는 이미지 데이터 자체가 아닌 팔레트 만 수정하면됩니다. –

+0

나는 너를 이해하지 못하거나 너는 내 질문을 정말로 이해하지 못한다. 수정하려는 각 이미지에는 완전히 투명하고 반투명/불투명 한 2 개의 알파 값이 있습니다. RGB 값을 수정하고 알파 값을 동일하게 유지하려고합니다. 즉, 팔레트 개념을 얻는 동안 안드로이드에는 팔레트 클래스가 없습니다. 내가 읽은 것에 대해 당신은 무엇을 제안합니까? – user432209

+0

@user : PNG 파일이 팔레트를 사용하는 경우, 팔레트 만 픽셀을 수정할 필요가 없다는 아이디어가 있습니다. SDK를 지원하지 않더라도 PNG 파일 자체를 원시 데이터로 읽고 메모리 스트림을 통해로드하기 전에 메모리에서 팔레트를 수정할 수 있습니다. 아주 멋진 해결책은 아니지만 필요한 경우 성능 향상을 가져올 수 있으며 더 좋은 아이디어는 없습니다. 압축 된 데이터를 다룰 필요가 없으므로 상대적으로 간단해야합니다. 자세한 내용은 [PNG spec] (http://www.w3.org/TR/2003/REC-PNG-20031110/)을 참조하십시오. –

답변

2

당신이 Bitmap에서 사용할 수있는 기능 봤어 : 당신은 픽셀 어레이가 화면의 상당한 부분을 차지 이미지에 대한 엄청난 것을 볼 수 있습니까? extractAlpha과 같은 것이 유용 할 것 같은데요. 또한 Android에서 구현되는 기능이 사용자의 요구에 정확히 부합하지 않는 경우 특정 케이스에 어떻게 적용 할 수 있는지를보기 위해 기능을 살펴 봅니다. 나를 위해 일한

+0

뭔가 비트 맵에서 사용할 수 있지만, 그 소리에서 extractAlpha는 메서드를 전달한 페인트의 RGB 값 (문서화되지 않은 경우가 아니라면)을 고려하지 않기 때문에 그렇게하지 않습니다. 총에 맞을만한 가치가 있을지도 모릅니다. 나는 그것을 시도 할 것이다. – user432209

+0

나는 그것이 당신의 모든 문제를 해결할 것이라는 의미는 아니었다. 설명서를 읽으면 drawCanvas와 결합하여 색상 정보를 채우는 방법에 대해 설명합니다. –

+0

와우, 작동했습니다! 불행하게도 2.2가 아니라 1.6. 1.6에 이상한 문제가 있지만, 그것은 또 다른 질문입니다. – user432209

1

대답은 광장

Transparent jpegs 그들은이 정확한 일을위한 빠른 코드를 제공 여기에 한 쓰기를했다. 나는 extractAlpha를 시도했지만 작동하지 않았지만 Square의 솔루션은 효과가있었습니다. 대신 자신의 솔루션을 수정하여 알파 비트가 아닌 색상 비트를 수정하십시오.

pixels[x] = (pixels[x] & 0xFF000000) | (color & 0x00FFFFFF); 
관련 문제