1

JAI を使用して、画像に「境界線」を追加しています。例えば

ParameterBlock pb = new ParameterBlock();
pb.addSource(r);
pb.add(leftPad);
pb.add(rightPad);
pb.add(topPad);
pb.add(bottomPad);

pb.add(new BorderExtenderConstant(consts));

r = JAI.create("border", pb);

上記の「consts」の値は、ColorModel によって異なります。ComponentColorModel を使用する場合、各ピクセルには独自の色があるため、パレットをいじる必要はありません。画像にパレット (GIF、PNG など) がある場合、ColorModel は IndexColorModel です。

IndexColorModel が使用されている場合、'consts' は double[] 配列で、サイズは 1 です。配列の値は、カラー パレットのインデックスです。

新しい IndexColorModel を作成してパレットを変更する方法を見つけましたが、コード化する必要があるロジックは正気ではありません。(たとえば、パレットに含めることができる色の数は、多くの要因によって異なります。さらに、新しい色を追加するためにパレットから色を削除する必要がある場合は、どの色を削除するのが最適かを判断するロジックが必要になります。次に、以前にその色を参照していたすべてのピクセルを変更します -- うわー、それは大量のコードです!)

それで、私の質問は、どのようにパレットに色を追加するのですか? 既存のライブラリはありますか? または、ioimage から何かを使用する必要がありますか? (正直に言うと、jai がどこで「終了」し、ioimage が「開始」するのか少し混乱しています。)

また、副次的な質問ですが、何らかの理由で、パレットに約 10 色しかないテスト画像が 256 色として読み込まれます。次にjaiで画像を保存すると、256色すべてが保存されます(11から255はすべて黒です)。なぜこれをやっているのですか?

ありがとう!デビッド

4

1 に答える 1

0

上記の質問に対して思いついた最善の解決策は、画像を IndexColorModel から ComponentColorModel に変換することです。(ComponentColorModel の各ピクセルは独自の色を指定するため、操作しなければならないパレットはありません。必要な色を簡単に使用できます。)

http://java.sun.com/products/java-media/jai/forDevelopers/jaifaq.html#paletteを読んだ後、この簡単な解決策を思いつきました

これは、画像を読んだ後に私がやっていることです:

if(image.getColorModel() instanceof IndexColorModel) {
    IndexColorModel icm = (IndexColorModel)image.getColorModel();
    byte[][] data = new byte[4][icm.getMapSize()];

    icm.getReds(data[0]);
    icm.getGreens(data[1]);
    icm.getBlues(data[2]);
    icm.getAlphas(data[3]);

    LookupTableJAI lut = new LookupTableJAI(data);

    image = JAI.create("lookup", image, lut);
}

操作を行ったら、画像を元に戻すことができます。私はそれを理解するのに時間を費やしていません。他の誰かがそれを理解したい場合は、これを読みたいかもしれません: http://www.java.net/node/675577

于 2011-11-14T15:56:26.653 に答える