*
  Мысли   Галерея   Проекты   Тексты  
  Мысли   Галерея   Проекты   Тексты  
Giver: Верблюд  (2010-06-29 10:28:35)
Лошадь
    сказала,
        взглянув на верблюда:
"Какая
    гигантская
        лошадь-ублюдок".

Верблюд же
    вскричал:
        "Да лошадь разве ты?!
Ты
 просто-напросто -
         верблюд недоразвитый".

И знал лишь
    бог седобородый,
что это -
    животные
        разной породы.

    1928. Владимир Маяковский.

Giver: хмл  (2010-03-31 06:16:25)

Прекрасный конфиг из jira в Ъ-ява-ынтырпрайз стиле. Вы не умеете писать конфиги? тогда мы идем к вам!

<values>
  <value>
    <key>false</key>
    <value>admin.service.common.handler.uses.ssl.no</value>
  </value>
  <value>
    <key>true</key>
    <value>admin.service.common.handler.uses.ssl.yes</value>
  </value>
</values>

Giver: Year with blender.  (2010-03-28 05:29:51)

Прошел ровно год, как я сел за блендер. Не могу сказать что весь год я усиленно использовал и изучал его, но удалось получить хоть какой-то уровень по блендеру, далеко не такой, как была возможность и как хотелось бы, но это вполне адекватная отдача учитывая сколько времени я ему уделил. Даже и так блендер мне понадобился для создание игрушки KeyTra, без него вряд ли бы вышло так круто. Итог: моделить, моделить, моделить.


Giver: Веселые разукрашки  (2010-01-10 08:03:18)

Бочонок намоделили, a теперь нужно его раскрасить. Причем в это же время нужно оставить alpha-канал в покое, то есть закрасить остальное, поэтому метод через g2d.setColor(new Color(цвет, 127)); g2d.fillRect(); отпал сразу. Долго ковырял Composite, но никаких положительных результатов это не дало. Уже ближе к полуночи в голове начал вызревать хитрый план.

Исходная картника(1) у нас в градациях серого , и это замечательно. То есть все каналы равны, кроме альфы. Убрав ненужный канал мы получим бочку, залитую оставшимися. Например если убрать красный и синий канал, оставив лишь зеленый выйдет бочка нумер 2, если же наоборот закрыть только зеленый, то выйдет пурпурный (3), закрыв синий канал получим желтую бочку (4). Спрятав все каналы получим силует бочки (5), или ее маску, вещь тоже иногда полезную.

Смотрим как у явы с каналами, видим что очень печально. Люди либо используют страшный обход всех пикселей копии картинки накладывая битовую маску. Другой, более, но недостаточно красивый вариант, использовать ColorLookupOp, для этого нужны еще два 256-элементных массива типа short, и картинка, опять же, на выходе будет копия. Ее хотелось бы избежать.

В отчаянии просматривая дебаггером содержимое BufferedImage я наткнулся на достаточно интересную штуку — ColorModel. Именно она занималась преобразованием набора байт в конкретный цвет. Превосходно! Пишем обертку которая скрывает по желанию некоторые каналы.

public class ShadowColorModel extends ComponentColorModel {
    boolean red, green, blue;

    /**
     * Копируем параметры из родитеслькой цветовой модели и сохраняем парамтртры преобразования 
     */
    public ShadowColorModel(ColorModel parent, boolean red, boolean green, boolean blue) {
        super(parent.getColorSpace(), parent.hasAlpha(), parent.isAlphaPremultiplied(), 
              parent.getTransparency(), parent.getTransferType());
        this.red = red;
        this.green = green;
        this.blue = blue;
    }

    /**
     * Если красный цвет разрешен, возвращаем значение, иначе 0
     */
    public int getRed(Object inData) {
        return red ? super.getRed(inData) : 0;
    }

    /**
     * Таким же образом поступаем с остальными цветами
     */
    public int getGreen(Object inData) {
        return green ? super.getGreen(inData) : 0;
    }

    public int getBlue(Object inData) {
        return blue ? super.getBlue(inData) : 0;
    }
}

Что мы получаем в итоге? Желанный эффект достигнут, стоит создать объект класса BufferedImage с тем же растром, что и исходная картинка, на наложив ограничения на каналы. При этом копирования данных картинки не происходит, она хранится в памяти лишь один раз. Падения производительности нет. Все рады и довольны.


Giver: Намоделим бочечку  (2010-01-10 06:53:12)