0

有没有办法在 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"));

我的输出在此处输入图像描述

4

1 回答 1

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,)

这将是等效的。为了保存亮度,您需要选择 3 个因子,使它们的总和为 1。这三个因子可以应用于双色调矩阵。因子越大,图像的颜色就越多。为了保持亮度,你需要 3 个因子 fb,fg,fr 使得

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

您可以选择因子 fb、fg、fr 来找到您选择的色调。

另外,请注意,您可以使用一个矩阵来执行此操作。只需结合您已有的两个矩阵。

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

只需计算 duoToneMatrix 和 grayMatrix 的乘积(按此顺序)并一步处理。

于 2012-08-03T17:45:16.887 回答