Как я обрезаю изображение в Java?

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

68
задан Alex L 1 February 2013 в 07:26
поделиться

3 ответа

Этот метод будет работать:

import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.Graphics;

public BufferedImage crop(BufferedImage src, Rectangle rect)
{
    BufferedImage dest = new BufferedImage(rect.getWidth(), rect.getHeight(), BufferedImage.TYPE_ARGB_PRE);
    Graphics g = dest.getGraphics();
    g.drawImage(src, 0, 0, rect.getWidth(), rect.getHeight(), rect.getX(), rect.getY(), rect.getX() + rect.getWidth(), rect.getY() + rect.getHeight(), null);
    g.dispose();
    return dest;
}

Конечно, вы должны создать свой собственный JComponent:

import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import java.awt.Graphics;
import javax.swing.JComponent;

public class JImageCropComponent extends JComponent implements MouseListener, MouseMotionListener
{
   private BufferedImage img;
   private int x1, y1, x2, y2;

   public JImageCropComponent(BufferedImage img)
   {
       this.img = img;
       this.addMouseListener(this);
       this.addMouseMotionListener(this);
   }

   public void setImage(BufferedImage img)
   {
       this.img = img;
   }

   public BufferedImage getImage()
   {
       return this;
   }

   @Override
   public void paintComponent(Graphics g)
   {
      g.drawImage(img, 0, 0, this);
      if (cropping)
      {
          // Paint the area we are going to crop.
          g.setColor(Color.RED);
          g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.max(x1, x2), Math.max(y1, y2));
      }
   }

   @Override
   public void mousePressed(MouseEvent evt)
   {
       this.x1 = evt.getX();
       this.y1 = evt.getY();
   }

   @Override
   public void mouseReleased(MouseEvent evt)
   {
       this.cropping = false;
       // Now we crop the image;
       // This is the method a wrote in the other snipped
       BufferedImage cropped = crop(new Rectangle(Math.min(x1, x2), Math.min(y1, y2), Math.max(x1, x2), Math.max(y1, y2));
       // Now you have the cropped image;
       // You have to choose what you want to do with it
       this.img = cropped;
   }

   @Override
   public void mouseDragged(MouseEvent evt)
   {
       cropping = true;
       this.x2 = evt.getX();
       this.y2 = evt.getY();
   }

   //TODO: Implement the other unused methods from Mouse(Motion)Listener

}

Я не тестировал его. Может быть, есть какие-то ошибки (я не уверен насчет всего импорта).

Вы можете поместить в этот класс метод crop (img, rect) . Надеюсь, это поможет.

14
ответ дан 24 November 2019 в 14:02
поделиться

Этот вопрос не содержит достаточно информации для ответа. Общее решение (в зависимости от вашего GUI фреймворка): добавьте обработчик событий мыши, который будет ловить щелчки и движения мыши. Это даст вам координаты (x, y). Затем используйте эти координаты для обрезки изображения.

6
ответ дан 24 November 2019 в 14:02
поделиться

Вам нужно прочитать о Java Image API и API, связанном с мышью, возможно, где-то в пакете java.awt.event.

Для начала вам нужно иметь возможность загрузить и вывести изображение на экран, возможно, вы будете использовать JPanel.

Затем вы попытаетесь реализовать интерфейс слушателя движения мыши и другие связанные с ним интерфейсы. Возможно, вы завяжетесь на методе mouseDragged...

Для действия mousedragged вы получите координаты прямоугольника, образованного перетаскиванием...

Затем из этих координат вы получите подизображение из имеющегося у вас изображения и как бы перерисуете его заново.....

А затем отобразите обрезанное изображение... Я не знаю, будет ли это работать, просто плод моего воображения... просто мысль!

2
ответ дан 24 November 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: