Как я могу отредактировать изображение jpg через Java? - PullRequest
12 голосов
/ 18 июня 2009

Я загрузил изображение в формате jpg, в котором я хочу нарисовать буквы и круги, учитывая координаты x, y.

Я пытался понять, что такое paintIcon ImageIcon class

public void paintIcon(Component c,
                      Graphics g,
                      int x,
                      int y)

Позволяет ли этот метод редактировать изображения jpg так, как я хочу? Что предполагается использовать для параметров Component c и Graphics? Что бы я добавил к его телу, чтобы нарисовать круги или буквы?

Я работаю на Netbeans 6.5, есть ли у меня что-нибудь встроенное для этой задачи (вместо ImageIcon)?

Ответы [ 5 ]

16 голосов
/ 18 июня 2009

Чистый Java-способ заключается в использовании ImageIO до загрузки изображения в виде BufferedImage. Затем вы можете позвонить createGraphics(), чтобы получить объект Graphics2D; затем вы можете нарисовать на изображении все, что захотите.

Вы можете использовать ImageIcon, встроенный в JLabel, для отображения, и вы можете добавить MouseListener и / или MouseMotionListener к JLabel, если вы пытаетесь разрешить пользователю отредактировать изображение.

11 голосов
/ 18 июня 2009

Управление изображениями в Java может быть достигнуто с помощью контекстов Graphics или Graphics2D.

Загрузка изображений, таких как JPEG и PNG, может выполняться с использованием класса ImageIO. Метод ImageIO.read принимает File для чтения и возвращает BufferedImage, который можно использовать для манипулирования изображением через Graphics2D (или Graphics, его суперкласс) контекст.

Контекст Graphics2D может использоваться для выполнения многих задач рисования и манипулирования изображениями. Для информации и примеров, Trail: 2D Graphics из Java Tutorials было бы очень хорошим началом.

Ниже приведен упрощенный (непроверенный) пример, который откроет файл JPEG и нарисует несколько кругов и линий (исключения игнорируются):

// Open a JPEG file, load into a BufferedImage.
BufferedImage img = ImageIO.read(new File("image.jpg"));

// Obtain the Graphics2D context associated with the BufferedImage.
Graphics2D g = img.createGraphics();

// Draw on the BufferedImage via the graphics context.
int x = 10;
int y = 10;
int width = 10;
int height = 10;
g.drawOval(x, y, width, height);

g.drawLine(0, 0, 50, 50);

// Clean up -- dispose the graphics context that was created.
g.dispose();

Приведенный выше код откроет изображение в формате JPEG и нарисует овал и линию. Когда эти операции выполняются для манипулирования изображением, BufferedImage может обрабатываться как любой другой Image, так как это подкласс Image.

Например, создав ImageIcon с помощью BufferedImage, можно встроить изображение в JButton или JLabel :

JLabel l = new JLabel("Label with image", new ImageIcon(img));
JButton b = new JButton("Button with image", new ImageIcon(img));

Оба JLabel и JButton имеют конструкторы, которые принимают ImageIcon, так что это может быть простым способом добавить изображение в компонент Swing.

5 голосов
/ 18 июня 2009

Используйте библиотеку, чтобы сделать это. Один, который вы можете попробовать, это JMagick .

2 голосов
/ 18 июня 2009

Я использовал библиотеку Java Advanced Imaging (http://java.sun.com/products/java-media/jai/forDevelopers/jaifaq.html),, но вы также можете посмотреть на ImageJ (http://rsbweb.nih.gov/ij/index.html)

)
1 голос
/ 18 июня 2009

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

Что-то вроде:

new ImageIcon("someUrl.png"){
    public void paintIcon(Component c, Graphics g, int x, int y) {
        super(c, g, x, y);
        g.translate(x, y);

        g.drawOval(0, 0, 10, 10);
        ...

        g.translate(-x, -y);
    }
};

Сказав это, ответ mmyers будет намного лучше, если вы захотите изменить данные изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...