2012-08-03 167 views
0

「雙色」效果是有的在Java中實現「雙色調」效果的方法嗎?如何在Java中實現

的想什麼,我做的一個很好的例子是herehere

我猜BandCombineOp可能的幫助。 要我,我應該首先轉換爲灰度,然後再應用像水木清華閾值效應。 但我沒有設法達到良好的產出。

此外,我不明白我怎麼可以設置顏色爲這種效果。

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")); 

我的輸出enter image description here

回答

2

從我可以告訴你,正在試圖改變圖像的色彩而不改變其luminosity。請注意與亮度的差異。

無論您是針對亮度還是亮度,您的問題歸結爲改變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,) 

更換你的矩陣,這將是等效的。爲了保持亮度,您需要選擇3個因子,使它們的和爲1.這三個因子可以應用於duoTone矩陣。更大的一個因素是,圖像將以這種顏色着色。爲了保持亮度,你需要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的產品(按此順序)並一步處理。