有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用JAI时,如何向调色板添加新颜色?

我正在使用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”是一个大小为1的双[]数组。数组中的值是调色板中的索引

我发现了如何通过创建一个新的IndexColorModel来修改调色板,但是我必须编写的逻辑将是疯狂的!(例如,调色板中可以有多少种颜色取决于许多因素。此外,如果我需要从调色板中删除一种颜色以添加新颜色,我需要确定哪种颜色最适合删除,然后修改以前引用该颜色的所有像素的逻辑——哇,代码太多了!)

所以,我的问题是,如何为调色板添加颜色?有现有的图书馆吗?或者我应该使用ioimage的东西?(老实说,我有点困惑jai“结束”和ioimage“开始”的位置。)

另外,还有一个小问题,出于某种原因,我的测试图像在调色板中只有大约10种颜色,但被读取为有256种颜色。当我用jai保存图像时,所有256色都被保存(11到255色都是黑色)。知道它为什么这么做吗

谢谢! 大卫


共 (1) 个答案

  1. # 1 楼答案

    对于上面的问题,我能想到的最好的解决方案是将图像从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