Java에서 이미지를 자르려면 어떻게합니까?
마우스를 사용하여 이미지를 수동으로 자르고 싶습니다.
이미지에 텍스트가 있고 이미지에서 텍스트를 선택하고이를 위해 마우스를 사용하여 해당 영역을 자르고 싶다고 가정합니다.
버퍼링 된 이미지를 자르는 데 가장 유용한 솔루션은 getSubImage (x, y, w, h);
내 자르기 루틴은 다음과 같이 끝났습니다.
private BufferedImage cropImage(BufferedImage src, Rectangle rect) {
BufferedImage dest = src.getSubimage(0, 0, rect.width, rect.height);
return dest;
}
이 질문에 대한 주요 답변에는 잠재적으로 두 가지 주요 문제가 있습니다. 첫째, 문서에 따라 :
public BufferedImage getSubimage (int x, int y, int w, int h)
지정된 직사각형 영역으로 정의 된 부분 이미지를 반환합니다. 반환 된 BufferedImage는 원본 이미지와 동일한 데이터 배열을 공유합니다.
본질적으로 이것이 의미하는 것은 getSubimage의 결과가 원본 이미지의 하위 섹션을 가리키는 포인터 역할을한다는 것입니다.
이것이 왜 중요한가요? 어떤 이유로 든 하위 이미지를 편집 할 계획이라면 원본 이미지도 편집됩니다. 예를 들어, 별도의 창에서 작은 이미지를 사용하여 원본 이미지를 확대 할 때이 문제가 발생했습니다. (확대경과 같은 종류). 좀 더 쉽게 특정 세부 사항을보기 위해 색상을 반전시킬 수 있었지만 "확대"된 영역도 원래 이미지에서 반전되었습니다! 따라서 원본 이미지의 작은 부분이 반전 된 색상이있는 반면 나머지 부분은 정상적으로 유지되었습니다. 대부분의 경우 이것은 중요하지 않지만 이미지를 편집하거나 잘린 부분의 복사본 만 원하는 경우 방법을 고려할 수 있습니다.
두 번째 문제가 있습니다. 다행히도 처음만큼 큰 문제는 아닙니다. getSubImage는 원본 이미지와 동일한 데이터 배열을 공유합니다. 즉, 전체 원본 이미지가 여전히 메모리에 저장됩니다. 이미지를 "자르기"하여 실제로 더 작은 이미지를 원한다고 가정하면 하위 이미지를 가져 오는 것이 아니라 새 이미지로 다시 그려야합니다.
이 시도:
BufferedImage img = image.getSubimage(startX, startY, endX, endY); //fill in the corners of the desired crop location here
BufferedImage copyOfImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = copyOfImage.createGraphics();
g.drawImage(img, 0, 0, null);
return copyOfImage; //or use it however you want
이 기술은 원본 이미지에 대한 링크없이 자체적으로 찾고있는 잘린 이미지를 제공합니다. 이렇게하면 원본 이미지의 무결성이 유지되고 더 큰 이미지를 저장하는 메모리 오버 헤드가 절약됩니다. (나중에 원본 이미지를 덤프하는 경우)
이것은 작동하는 방법입니다.
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
}
나는 그것을 시험하지 않았다. 실수가있을 수도 있습니다 (모든 수입품에 대해 잘 모르겠습니다).
You can put the crop(img, rect)
method in this class. Hope this helps.
File fileToWrite = new File(filePath, "url");
BufferedImage bufferedImage = cropImage(fileToWrite, x, y, w, h);
private BufferedImage cropImage(File filePath, int x, int y, int w, int h){
try {
BufferedImage originalImgage = ImageIO.read(filePath);
BufferedImage subImgage = originalImgage.getSubimage(x, y, w, h);
return subImgage;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
This question has not enough information to answer. A general solution (depending on your GUI framework): add a mouse event handler that will catch clicks and mouse movements. This will give you your (x, y) coordinates. Next use these coordinates to crop your image.
You need to read about Java Image API and mouse-related API, maybe somewhere under the java.awt.event package
.
For a start, you need to be able to load and display the image to the screen, maybe you'll use a JPanel
.
Then from there, you will try implement a mouse motion listener interface and other related interfaces. Maybe you'll get tied on the mouseDragged
method...
For a mousedragged
action, you will get the coordinate of the rectangle form by the drag...
Then from these coordinates, you will get the subimage from the image you have and you sort of redraw it anew....
And then display the cropped image... I don't know if this will work, just a product of my imagination... just a thought!
I'm giving this example because this actually work for my use case.
I was trying to use the AWS Rekognition API. The API returns a BoundingBox object:
BoundingBox boundingBox = faceDetail.getBoundingBox();
The code below uses it to crop the image:
import com.amazonaws.services.rekognition.model.BoundingBox;
private BufferedImage cropImage(BufferedImage image, BoundingBox box) {
Rectangle goal = new Rectangle(Math.round(box.getLeft()* image.getWidth()),Math.round(box.getTop()* image.getHeight()),Math.round(box.getWidth() * image.getWidth()), Math.round(box.getHeight() * image.getHeight()));
Rectangle clip = goal.intersection(new Rectangle(image.getWidth(), image.getHeight()));
BufferedImage clippedImg = image.getSubimage(clip.x, clip.y , clip.width, clip.height);
return clippedImg;
}
참고URL : https://stackoverflow.com/questions/2386064/how-do-i-crop-an-image-in-java
'developer tip' 카테고리의 다른 글
Dataset.map, Dataset.prefetch 및 Dataset.shuffle에서 buffer_size의 의미 (0) | 2020.11.06 |
---|---|
문자열을 NSDate로 변환 (0) | 2020.11.06 |
앵커를 숨기지 않고 앵커 텍스트를 숨기려면 어떻게합니까 (0) | 2020.11.06 |
Java에서 컬렉션이 비어 있는지 확인 : 가장 좋은 방법은 무엇입니까? (0) | 2020.11.06 |
gcc / g ++ :“해당 파일 또는 디렉토리 없음” (0) | 2020.11.05 |