当前位置: 首页 > 知识库问答 >
问题:

如何在不改变DPI的情况下使用java剪切图像的一部分

仲孙献
2023-03-14

我试图使用Robot机器人=new Robot(); BufferedImage img=robot.create屏幕捕获(new Rectgle(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作为打印就绪的图像。任何想法请建议。

共有1个答案

燕涵容
2023-03-14

您需要使用AffineTransform,按300/72d的系数对图像重新采样,如下所示。在插值时,指定更高质量的AffineTransformOp。为插值类型键入双三次,尽管速度较慢。更新图像的metatdata,如下所示。

 类似资料:
  • 问题是如何使用OpenCV旋转图像并保持原始尺寸。当前正在使用此功能: 此外,在warpAffine中使用了什么样的算法(Bicubic?)

  • 我有一个图像,它有一个最大像素值-和最小像素值-我试图使它们在范围之间 我所做的:- 我已经将所有像素值除以最大像素值再乘以255 这使得我的最高像素值为1,但我的最小像素值仍然是负像素值。 这是一个医学图像,所以我想保留每个像素强度,所以我不想在0-255之间剪辑它们 但是我怎么能在不裁剪的情况下把它们放在那个范围内(这会损坏图像结构)。 使用库加载它们,如或自动剪裁像素值。

  • 我不熟悉svg。我有一个图像,我想旋转。我已经使用旋转变换旋转了图像,并给了它一个角度和我想要旋转图像的点的坐标。 我的要求是,当我在旋转后拖动图像时,我想检查左上角是否在边界区域内。这在旋转之前起作用。但在旋转后,似乎在将此变换应用于图像后,我的坐标系也以相同的角度旋转。这给我带来了一些问题。 有没有办法在不旋转原始坐标系的情况下旋转图像?此外,若旋转图像,图像的x和y属性也不会更新。

  • 问题内容: 我有一个很长的页面,可在用户滚动浏览时动态加载图像。 但是,如果用户快速滚动离开页面的某个部分,我不希望图像继续加载到页面的该部分视图之外。 除了图像加载外,页面上还同时发生了许多其他请求,因此在scroll事件上触发钝化window.stop()是不可接受的。 我尝试删除并清除不再可见的图像的img src属性,但是,由于请求已经启动,因此图像会继续加载。 请记住,当用户短暂滚动经过

  • 目前,我正在用下面的代码做一个非常简单的方法。 如果我删除代码的部分,它将图像打印为正常质量+正常大小,因为我希望它的高度限制在250,并返回类似于此图像的内容。 但它返回的内容类似于下面显示的内容。

  • 我正在尝试从组件更新(添加,删除)查询参数。在angularJS中,由于: 我有一个应用程序,其中包含用户可以过滤,排序等列表,我想在url的查询参数中设置所有激活的过滤器,以便他可以复制/粘贴URL或与其他人共享。