私は与えられた画像にフィルタを適用できるはずの単純な画像処理ツールを開発中です。私はラムダ式とストリームで機能的な方法でこれをどのように解決するのだろうと思っていました。Javaストリーム - プロセスのrgb値
私は、argb値を持つArrayListとしてカーネルを返すメソッドを記述しました。このメソッドは、どのフィルタを適用するかによってさらに処理できます。たとえば、ボックスフィルタを適用する場合は、すべての要素を合計し、要素数で除算する必要があります。もちろん、私はこれをすべてのrgb値で個別に行う必要があります。
私は以下のように値を取得するために使用:
// Get rgb values:
r = (argb >> 16) & 0xff;
g = (argb >> 8) & 0xff;
b = argb & 0xff;
// Write back to argb:
argb = (0xFF << 24) | (r << 16) | (g << 8) | b;
しかし、私はストリームでこれを書くでしょうか、何をここに挿入することは値を分割し、独立してそれらを処理し、結果を置く方法を確認していません一緒に戻る
IntStream.range(0, src.length).parallel().forEach(i ->
dst[i] = getKernelValues(3, src, i, width, height).stream()
.mapToInt(Integer::intValue)
.sum()/9);
私がここで書いたのは、argb値全体をとるため、完全に間違っています。しかし、多分あなたは私が後で他のフィルタに使うことができる実際の例にそのpiceを変更するのを助けることができます。
ありがとうございます。
編集:
それまでのところ、私は問題を次のように分割することで問題を迂回しました。これは動作しますが、コードは重複しています。誰かがこれをより少ないコードでどのように知っていれば、私は知ってうれしいです。
ありがとうございます。
IntStream.range(0, src.length).parallel().forEach(i -> {
ArrayList<Integer> values = getKernelValues(filterSize, src, i, width, height);
int r = values
.stream()
.map(j -> (j >> 16) & 0xff)
.reduce(0, (j, k) -> j + k);
r /= (filterSize * filterSize);
int g = values
.stream()
.map(j -> (j >> 8) & 0xff)
.reduce(0, (j, k) -> j + k);
g /= (filterSize * filterSize);
int b = values
.stream()
.map(j -> j & 0xff)
.reduce(0, (j, k) -> j + k);
b /= (filterSize * filterSize);
dst[i] = 0xff << 24 | r << 16 | g << 8 | b;
});
あなたの現在のコードの何が問題になっているのですか? – Tunaki
最後の段落で述べたように、getKernelValues()はargb整数値のArrayListを返します。もちろん、すべてのカラーチャンネルを別々に処理する必要があります。 – amaridev
期待している出力の種類はまだ分かりません。あなたは例を投稿できますか? – Tunaki