Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Антиалиасинг в Java 2D 
:(
    Опции темы
monax
Дата 23.11.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 9.6.2005

Репутация: нет
Всего: 4



При вращении картинки средствами Java 2D у картики получаются ступенчатые края. Поискал в сети - везде говорят, что антиалиасинг работает с примитивами, которые рисует JVM. А о том, как сгладить края у вращающейся картинки не нашёл. Кто-нибудь знает, как обойти эту проблему?
Код

package rotate;

import java.awt.Color;
import java.awt.Image;
import java.awt.MediaTracker;

import javax.swing.JApplet;

public class Rotate extends JApplet {
    
    private Screen screen;
    
    public void init() {
        
        MediaTracker tracker = new MediaTracker(this);
        Image img = getImage(getCodeBase(), "resources/tail.png");
        tracker.addImage(img, 0);
        try {
            tracker.waitForID(0);
        } catch (InterruptedException e) {
        }
        img.flush();

        screen = new Screen(img);
        setContentPane(screen);
        new Thread(screen).start();
    }
}

Код

package rotate;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;

import javax.swing.JPanel;

public class Screen extends JPanel implements Runnable {

    private Image tail;

    private AffineTransform at;

    public Screen(Image img) {
        super();
        tail = img;
        at = new AffineTransform();

        at.setToTranslation(200, 100);
    }

    public void paintComponent(Graphics gc) {
        super.paintComponent(gc);

        Graphics2D g2d = (Graphics2D) gc;

        // это не помогает
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setColor(Color.BLACK);
        g2d.drawImage(tail, at, this);
    }

    public void run() {
        while (true) {
            try {
                Thread.sleep(30);
            } catch (InterruptedException ie) {
            }
            at.rotate(Math.toRadians(1));
            repaint();
        }
    }
}

--------------------
Лаборатория программиста
PM MAIL WWW ICQ Jabber   Вверх
w1nd
Дата 24.11.2007, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 23
Всего: 54



Нужно читать теорию по java2d - там всё не так уж и просто. Вот так работает:

Код
package rotate;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JApplet;

public class Rotate extends JApplet {
    
    private Screen screen;
    
    public void init() {
        
        BufferedImage img = null;
        try {
            img = ImageIO.read(...); 
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        screen = new Screen(img);
        setContentPane(screen);
        new Thread(screen).start();
    }

}


Код
package rotate;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.TexturePaint;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class Screen extends JPanel implements Runnable {

    private BufferedImage tail;

    private AffineTransform at;
    private Paint paint;

    public Screen(BufferedImage img) {
        super();
        tail = img;
        at = new AffineTransform();
        paint = new TexturePaint(tail, new Rectangle2D.Float(0, 0, tail.getWidth(), tail.getHeight()));
        at.setToTranslation(200, 100);
    }

    public void paintComponent(Graphics gc) {
        super.paintComponent(gc);

        Graphics2D g2d = (Graphics2D) gc;

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

        g2d.setTransform(at);
        g2d.setPaint(paint);
        
        g2d.fillRect(0, 0, tail.getWidth(), tail.getHeight());
    }

    public void run() {
        while (true) {
            try {
                Thread.sleep(30);
            } catch (InterruptedException ie) {
            }
            at.rotate(Math.toRadians(1));
            repaint();
        }
    }

}


Это сообщение отредактировал(а) w1nd - 24.11.2007, 01:09


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.