2012-08-03 4 views
0

Java에서 "Duotone"효과를 구현할 수있는 방법이 있습니까?Java에서 "Duotone"효과를 구현하는 방법

내가하고 싶은 것의 좋은 예는 here 또는 내가 BandCombineOp 도움이 될 것 같아요

here입니다. 나에게 그것을 먼저 회색으로 변환하고 임계 효과와 같은 부드럽게 적용해야합니다. 하지만 좋은 결과물을 얻을 수 없었습니다.

또한이 효과를 위해 색상을 설정하는 방법을 모르겠다.

float[][] grayMatrix = new float[][] 
      { 
       new float[] {0.3f, 0.3f, 0.3f}, 
       new float[] {0.3f, 0.3f, 0.3f}, 
       new float[] {0.3f, 0.3f, 0.3f}, 
      }; 

    float[][] duoToneMatrix = new float[][] 
      { 
        new float[] {0.1f, 0.1f, 0.1f}, 
        new float[] {0.2f, 0.2f, 0.2f}, 
        new float[] {0.1f, 0.1f, 0.1f}, 
      }; 

    BufferedImage src = ImageIO.read(new File("X:\\photoshop_image_effects.jpg")); 
    WritableRaster srcRaster = src.getRaster(); 

    // make it gray 
    BandCombineOp bco = new BandCombineOp(grayMatrix, null); 
    WritableRaster dstRaster = bco.createCompatibleDestRaster(srcRaster); 
    bco.filter(srcRaster, dstRaster); 

    // apply duotone 
    BandCombineOp duoToneBco = new BandCombineOp(duoToneMatrix, null); 
    WritableRaster dstRaster2 = bco.createCompatibleDestRaster(dstRaster); 
    duoToneBco.filter(dstRaster, dstRaster2); 

    BufferedImage result = new BufferedImage(src.getColorModel(), dstRaster2, src.getColorModel().isAlphaPremultiplied(), null); 
    ImageIO.write(result, "png", new File("X:\\result_duotone.png")); 

내 출력 난 당신이 그 luminosity를 변경하지 않고 이미지의 색상을 변경하려고 무엇을 말할 수에서 enter image description here

답변

2

. 휘도와의 차이를 확인하십시오.

휘도 또는 광도를 조준하고 있는지 여부에 관계없이 문제는 가중치 합을 변경하지 않고 B, G 및 R의 상대 기여도를 변경하는 것으로 나타납니다. 첫 번째 행렬은 B, G, R을 동일한 값으로 설정하고 휘도를 약간만 변경하여 그레이 스케일로 변환합니다 (.3 + .3 + .3 = .9). 광도를 대신 사용하려면

greyMatrix = (.11,.59,.3, 
       .11,.59,.3, 
       .11,.59,.3); //note this is for bgr 

그런 다음 가중치 합을 변경하지 않고 상대적인 가중치를 변경하려고합니다. 첫째, 그레이 스케일 변환하여 B 후, G는, R 값이 동일하기 때문에 당신이

duoToneMatrix = (0,.3,0, 
       0,.6,0, 
       0,.3,0,) 

하여 매트릭스를 대체 할 수 있습니다 그것은 동등 할 것이다. 광도를 보존하려면 합계가 1이되도록 3 가지 요인을 선택해야합니다.이 세 가지 요인은 듀오 톤 매트릭스에 적용 할 수 있습니다. 요인이 클수록 색조가 더 밝아집니다. 광도를 유지하려면 3 요인 FB, FG 필요, FR 등이

fb*.11+fg*.59+fr*.3 = 1; //again for bgr 

당신은 당신의 선택의 색조를 찾기 위해 요인 FB, FG, FR를 선택할 수 있습니다.

또한 하나의 행렬로이 작업을 수행 할 수 있습니다. 이미 가지고있는 두 행렬을 결합하면됩니다.

[duoToneMatrix]*[greyMatrix]*vector = ([duoToneMatrix]*[greyMatrix])*vector; 

그냥 duoToneMatrix와 greyMatrix의 제품을 (순서대로) 계산하고 한 단계로 처리하십시오.

관련 문제