색상을 적용 할 일부 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;
}
아마도 당신은 팔레트 이미지를 사용할 수있는 즉? 모든 색상에 하나의 색상을 사용하기 때문에 RGB 성분이 동일하고 A 부분 만 달라지기 때문에 하나의 입력에서 256 개의 가능한 픽셀 색상을 얻을 수 있음을 의미합니다. 이미지에 256 색의 팔레트가 있고 알파 채널의 값이 다른 경우에는 이미지 데이터 자체가 아닌 팔레트 만 수정하면됩니다. –
나는 너를 이해하지 못하거나 너는 내 질문을 정말로 이해하지 못한다. 수정하려는 각 이미지에는 완전히 투명하고 반투명/불투명 한 2 개의 알파 값이 있습니다. RGB 값을 수정하고 알파 값을 동일하게 유지하려고합니다. 즉, 팔레트 개념을 얻는 동안 안드로이드에는 팔레트 클래스가 없습니다. 내가 읽은 것에 대해 당신은 무엇을 제안합니까? – user432209
@user : PNG 파일이 팔레트를 사용하는 경우, 팔레트 만 픽셀을 수정할 필요가 없다는 아이디어가 있습니다. SDK를 지원하지 않더라도 PNG 파일 자체를 원시 데이터로 읽고 메모리 스트림을 통해로드하기 전에 메모리에서 팔레트를 수정할 수 있습니다. 아주 멋진 해결책은 아니지만 필요한 경우 성능 향상을 가져올 수 있으며 더 좋은 아이디어는 없습니다. 압축 된 데이터를 다룰 필요가 없으므로 상대적으로 간단해야합니다. 자세한 내용은 [PNG spec] (http://www.w3.org/TR/2003/REC-PNG-20031110/)을 참조하십시오. –