Используя JAI, как мне добавить новый цвет в палитру?

#java #jai

#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’ зависит от цветовой модели. При использовании ComponentColorModel каждый пиксель имеет свой собственный цвет, поэтому мне не нужно возиться с палитрой. Когда изображение имеет палитру (GIF, PNG, …), цветовой моделью является IndexColorModel.

Когда используется IndexColorModel, то ‘consts’ представляет собой двойной массив [] размером в единицу. Значение в массиве — это индекс в цветовой палитре.

Я нашел, как изменить палитру, создав новую IndexColorModel, но логика, которую мне пришлось бы кодировать, была бы безумной! (Например. Сколько цветов у меня может быть в палитре, зависит от многих факторов. Кроме того, если мне нужно удалить цвет из палитры, чтобы добавить новый, мне понадобится логика, которая определяет, какой цвет лучше всего удалить, а затем изменяет все пиксели, ранее ссылающиеся на этот цвет — вау, это много кода!)

Итак, мой вопрос в том, как добавить цвет в палитру? Существует ли существующая библиотека? Или я должен использовать что-то из ioimage? (Честно говоря, я немного запутался, где jai «заканчивается», а ioimage «начинается».)

Также, побочный вопрос, по какой-то причине мои тестовые изображения, которые имеют только около 10 цветов в палитре, считываются как имеющие 256 цветов. Когда я затем сохраняю изображение с помощью jai, сохраняются все 256 цветов (с 11 по 255 все черные). Есть идеи, почему он это делает?

Спасибо! Дэвид

Ответ №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