gpt4 book ai didi

java - 如何使用java剪切图像的一部分而不改变DPI

转载 作者:行者123 更新时间:2023-12-01 12:40:36 25 4
gpt4 key购买 nike

我需要剪切使用鼠标选择的图像部分。我尝试使用 Robot robots = new Robot(); BufferedImage img = robots.createScreenCapture(new Rectangle(c1, c2, w, h));

这会将图像剪切为 72 dpi。我的完整源代码

  public class CropImage extends JFrame implements MouseListener,      MouseMotionListener {

int drag_status = 0, c1, c2, c3, c4;
String homedirectory = System.getProperty("user.dir");

public static void main(String args[]) {
new CropImage().start();
}

public void start() {
ImagePanel im = new ImagePanel(homedirectory+"/"+"images"+"/"+"6.jpg");
add(im);
setSize(400, 400);
setVisible(true);
addMouseListener(this);
addMouseMotionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void draggedScreen() throws Exception {
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
Robot robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2, w, h));
File save_path = new File("screen1.jpg");
ImageIO.write(img, "JPG", save_path);
System.out.println("Cropped image saved successfully.");
JOptionPane.showMessageDialog(null, "Cropped image saved successfully.");
}

@Override
public void mouseClicked(MouseEvent arg0) {
}

@Override
public void mouseEntered(MouseEvent arg0) {
}

@Override
public void mouseExited(MouseEvent arg0) {
}

@Override
public void mousePressed(MouseEvent arg0) {
repaint();
c1 = arg0.getX();
c2 = arg0.getY();
}

@Override
public void mouseReleased(MouseEvent arg0) {
repaint();
if (drag_status == 1) {
c3 = arg0.getX();
c4 = arg0.getY();
try {
draggedScreen();
} catch (Exception e) {
e.printStackTrace();
}
}
}

@Override
public void mouseDragged(MouseEvent arg0) {
repaint();
drag_status = 1;
c3 = arg0.getX();
c4 = arg0.getY();
}

@Override
public void mouseMoved(MouseEvent arg0) {
}

public void paint(Graphics g) {
super.paint(g);
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
if (w < 0) {
w = w * -1;
}
g.drawRect(c1, c2, w, h);
}

}

类 ImagePanel 扩展了 JPanel {

private Image img;

public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}

public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
// Dimension size = new Dimension(10,10);
setPreferredSize(size); setMinimumSize(size);
setMaximumSize(size); setSize(size); setLayout(null);
}

public void paintComponent(Graphics g)
{
g.drawImage(img, 0, 0, null);
}

}

我需要以 300 dpi 裁剪所选部分作为打印就绪图像。有什么想法请提出。

最佳答案

您需要resample使用 AffineTransform 将图像放大 300/72d 倍,如图here 。正如你一样interpolating ,为 interpolationType 指定更高质量的 AffineTransformOp.TYPE_BICUBIC,尽管速度较慢。更新图像的元数据,如图 here .

关于java - 如何使用java剪切图像的一部分而不改变DPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25140204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com