2011-10-01 6 views
6

저는 아바타 구성 요소가 투명성이있는 PNG 파일에서 생성되는 아바타 생성기를 만들고 있습니다. 파일은 body_1.png 또는 legs_5.png와 같은 항목입니다. 투명도는 부품 주위이지만 부품 안에 있지 않으며 이미지는 모두 회색 음영입니다. 부품이 잘 겹쳐져 있으며 회색 음영 아바타를 얻을 수 있습니다.Java에서 투명도가있는 회색 음영 이미지를 채색하는 적절한 방법은 무엇입니까?

동적으로이 부분을 색상 화 할 수 있기를 바라지 만, 지금까지 나는 행운을 가지고 있지 않다. 픽셀 데이터를 RGB에서 HSL로 변환하고 원래 픽셀의 L 값을 사용하면서 새로운 색상의 H 값을 제공하려고 시도했지만 결과가 좋지 않습니다.

나는 Colorize grayscale image 검토 한하지만 난 그가 자바에서 일을 무슨 말 할 수없는 것. 나는 네온 컬러를 도처에 상당히 밝게 표현한 이미지로 끝을 맺는다. 그레이 스케일 부분을 색상 화하면서 투명성, 유지를 위해 내가 좋아하는 것이 무엇

이다. 검은 색 외곽선은 여전히 ​​검정색이어야하며 흰색 하이라이트 영역은 여전히 ​​흰색이어야합니다 (제 생각 엔).

아무에게도 좋은 방법이 있을까요?

편집 :

저는 여기에 컬러를 시도 할 수있는 이미지의 : Sample Body

는 다시, 나는 그레이 스케일 이미지의 밝기 수준을 유지하려는 (그래서 윤곽이 어둠 유지, 그라디언트가 볼 수 있습니다, 흰색 패치가 흰색 임).

나는 다소 Colorizing images in Java를 기반으로하지만 색상이 항상 칙칙한 어두운 보면 작업 LookupOp가를 얻을 수있었습니다. 이것은 내 LookupOp가

protected LookupOp createColorizeOp(short R1, short G1, short B1) { 
    short[] alpha = new short[256]; 
short[] red = new short[256]; 
short[] green = new short[256]; 
short[] blue = new short[256]; 

//int Y = 0.3*R + 0.59*G + 0.11*B 

    for (short i = 0; i < 30; i++) { 
    alpha[i] = i; 
     red[i] = i; 
     green[i] = i; 
     blue[i] = i; 
} 

for (short i = 30; i < 256; i++) {  
    alpha[i] = i; 
    red[i] = (short)Math.round((R1 + i*.3)/2); 
     green[i] = (short)Math.round((G1 + i*.59)/2); 
     blue[i] = (short)Math.round((B1 + i*.11)/2); 

    } 


    short[][] data = new short[][] { 
      red, green, blue, alpha 
    }; 

    LookupTable lookupTable = new ShortLookupTable(0, data); 
    return new LookupOp(lookupTable, null); 
} 

EDIT 2 http://www.color-hex.com/color/b124e7

: Sample Output

사용되고 색상이 온 (휘도 차를 참고)이다 : 여기

내 출력의 예 : 나는 다음을 사용하여 내 LookupOp가 변경 훨씬 더 좋은 찾고 색상을 가지고 :

red[i] = (short)((R1)*(float)i/255.0); 
green[i] = (short)((G1)*(float)i/255.0); 
blue[i] = (short)((B1)*(float)i/255.0); 
을 이 같은
+0

더 나은 도움을 받으려면 [SSCCE] (http://pscode.org/sscce.html)를 게시하십시오. SSCCE에서 이미지를 사용하는 것은 까다 롭습니다. 인터넷상의 이미지에 핫 링크하거나 코드로 생성 할 수 있습니다. –

답변

2

그것은 당신을 위해 작동 할 어떤 것입니다 :

for each pixel 
    if pixel is white, black or transparent then leave it alone 
    else 
     apply desired H and S and make grayscale value the L 
     convert new HSL back to RGB 

편집 : 것 같다

특수 치료 어두운 톤 원하는 : 이미지를보고 난 후에 나는 코멘트 몇 가지있다 왜냐하면 당신은 30 이하를 색칠하지 않기 때문입니다. 동일한 논리에 따라 더 높은 값을 채색하는 것을 면제해도됩니까? 그렇게하면 백인과 가까운 백인이 색을 칠하는 것을 방지 할 수 있습니다.

RGB와 함께 알파 값을 설정하면 안됩니다. 원본 이미지의 알파 값은 항상 보존되어야합니다. 룩업 테이블 알고리즘은 RGB에만 영향을줍니다. 당신은 당신이 HSL 시도라고하지만

, 그건 당신이 게시 코드에 있지 않습니다. HSL에서 색상 화를 수행 한 다음 회색 음영의 원래 밝기를 유지하므로 결과 테이블의 색상을 RGB로 변환해야합니다.

short H = ??; // your favorite hue 
short S = ??; // your favorite saturation 
for (short i = 0; i < 256; i++) { 
    if (i < 30 || i > 226) { 
     red[i] = green[i] = blue[i] = i; // don't do alpha here 
    } 
    else { 
     HSL_to_RGB(H, S, i, red[i], green[i], blue[i]) 
    } 
} 

주 : 조회 테이블 생성은 다음과 같이 될 수는 RGB 변환 기능에 HSL을 제공해야합니다. 소스 코드에 대한 링크는 내 대답 Colorize grayscale image을 참조하십시오.

관련 문제