#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