Как редактировать jpg-образ через Java?

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

Я пытаюсь вычислить paintIcon ImageIcon класс

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ниже приведен упрощенный пример (непроверенный), который откроет файл 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.

Ответ 3

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

Ответ 5

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

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

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 намного лучше, если вы хотите изменить данные изображения.