0

Javaで「ダブルトーン」効果を実装する方法はありますか?

私がやりたいことの良い例はhereまたはhereです

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

そしてそれは同等です。輝度を維持するには、合計が 1 になるように 3 つの要素を選択する必要があります。これらの 3 つの要素は duoTone Matrix に適用できます。係数が大きいほど、画像はその色でより着色されます。光度を維持するには、次のような 3 つの要素 fb、fg、fr が必要です。

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

係数 fb、fg、fr を選択して、選択した色合いを見つけることができます。

また、これは 1 つのマトリックスで実行できることに注意してください。すでに持っている 2 つのマトリックスを組み合わせるだけです。

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

duoToneMatrix と grayMatrix の積を (この順序で) 計算し、1 つのステップで処理します。

于 2012-08-03T17:45:16.887 に答える