如何在Java中实现
问题描述:
“双色”效果是有的在Java中实现“双色调”效果的方法吗?如何在Java中实现
我猜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"));
我的输出
答
从我可以告诉你,正在试图改变图像的色彩而不改变其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的产品(按此顺序)并一步处理。