2012-08-03 109 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的产品(按此顺序)并一步处理。