Используя JAI, как мне добавить новый цвет в палитру? - PullRequest
1 голос
/ 08 ноября 2011

Я использую 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' - это двойной массив [] размером один. Значением в массиве является индекс в цветовой палитре.

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

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

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

Спасибо! David

1 Ответ

0 голосов
/ 14 ноября 2011

Лучшее решение, которое мне удалось найти в ответе на мой вопрос выше, - преобразовать изображение из 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

...