Прозрачность в буферизованных объектах изображения - PullRequest
2 голосов
/ 15 апреля 2010

Я заметил, что когда я рисую что-то с цветом (0,0,0,0) над другим изображением, показанный цвет - это фон JFrame, а не изображение чуть ниже.

Причины, которые помогли бы мне найти решение?

Спасибо !!

Редактировать: Посмотрите на круги, серая область (углы) должна быть прозрачной, но не цветом, а цветом JFrame. альтернативный текст http://img72.imageshack.us/img72/9657/transparency.png

А вот код для рисования кругов:

public void paint(final Graphics g) {
        super.paintComponent(g);
        final Graphics2D g2 = (Graphics2D) g;

        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        if (unitImage == null) {

            unitImage = (BufferedImage) (createImage(30, 30));
            final Graphics2D gc = unitImage.createGraphics();
            gc.setRenderingHints(rh);
            gc.setColor(outsideColor);
            gc.fillOval(0, 0, diameter, diameter);
            gc.setColor(middleColor);
            gc.fillOval(diameter / 6, diameter / 6, (diameter / 3) * 2, (diameter / 3) * 2);
            gc.setColor(innerColor);
            gc.fillOval(diameter / 3, diameter / 3, diameter / 3, diameter / 3);
        }

        g2.drawImage(unitImage, null, 0, 0);

Играю с альфа-композитами, думаю, это не решение проблемы. Поэтому я добавил всю эту новую информацию, которая, я верю, поможет вам, ребята, дать мне еще один совет.

Ответы [ 3 ]

7 голосов
/ 15 апреля 2010

Вы установили AlphaComposite перед рисованием?

Graphics2D g2d = (Graphics2D)g; //Some graphics object
//Save the original
Composite original = g2d.getComposite();
//Set to semi translucent
Composite translucent = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
g2d.setComposite(translucent);

//Draw

//Set back to original
g2d.setComposite(original);

Отказ от ответственности: проверка кода проверена

6 голосов
/ 15 апреля 2010

@ Чук Ли прав: если вы не измените его, по умолчанию Graphics2D составной - AlphaComposite.SrcOver. Этот удобный инструмент отображает составной результат для выбранного правила и указанной пары цветов и букв.

Приложение. Один из подходов состоит в том, чтобы переопределить paintComponent() и визуализировать и карту, и круги, но вы можете сделать углы прозрачными, очистив альфа:

...
gc.setRenderingHints(rh);
gc.setComposite(AlphaComposite.Clear);
gc.fillRect(0, 0, diameter, diameter);
gc.setComposite(AlphaComposite.Src);
gc.setColor(outsideColor);
...

Относится ли createImage(30, 30) к diameter? Для какого компонента вы переопределяете paint() и вызываете super.paintComponent(g)?

2 голосов
/ 15 апреля 2010

Вы рисуете с непрозрачностью 0. Если вы хотите получить черный цвет, используйте Цвет (0,0,0,255).

UPDATE

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

Чтобы обеспечить прозрачность, вам нужны две вещи:

  1. вам нужно вызвать setOpaque (false) в конструкторе целевого компонента
  2. Либо нарисуйте непосредственно цель, не сохраняя хранилище, либо используйте изображение RGBA:

    unitImage = новый BufferedImage (30, 30, BufferedImage.TYPE_INT_ARGB);

...