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 回答