Java中如何裁剪图片

举报
KevinQ 发表于 2024/10/17 08:38:13 2024/10/17
【摘要】 Java中使用BufferedImage裁剪图片

需求来源

最近工作中,遇到一个需求,用户有固定格式的图片,在指定位置有一个二维码。在没有上架系统之前,用户每次都需要使用截图工具,手动将二维码选中,然后保存,再粘贴到文件的指定位置上去,操作十分的繁琐、耗时耗力。

因此,需要我们软件系统提供一个工具来方便的将图片中的二维码裁剪下来,保存,并将二维码附到指定文件的指定位置。

本文单纯说图片裁剪的问题。

深入了解了一下用户需求,用户的图片都是固定软件产生的,二维码的位置都是固定的,因此,每张图片中,二维码的坐标与大小都是固定的。基于此判断,我们不需要使用二维码识别软件,只需要按照坐标与大小,将图片指定位置的图剪切出来即可。

裁剪工具

我们使用的工具是java.awt.image.BufferedImageBufferedImage是一个带缓冲区的图像类,它实现了java.awt.image.RenderedImage接口,提供了对图像的直接访问和操作能力,可以进行像素级别的修改、绘制图形、应用图像过滤器等操作。

裁剪代码

/**
     *
     * @param inputStream 输入图片
     * @param x 需要裁剪的坐标x
     * @param y 需要裁剪的坐标y
     * @param width 需要裁剪的子图宽度
     * @param height 需要裁剪的子图高度
     * @return
     */
    public static InputStream cropQrCode(InputStream inputStream, int x, int y, int width, int height) {
        try {
            // 读取输入流中的图片
            BufferedImage originalImage = ImageIO.read(inputStream);

            // 裁剪图片
            BufferedImage croppedImage = originalImage.getSubimage(x, y, width, height);

            // 将裁剪后的图片输出到字节数组输出流
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ImageIO.write(croppedImage, "jpg", outputStream);

            // 将字节数组输出流转换为输入流并返回
            return new ByteArrayInputStream(outputStream.toByteArray());
        } catch (IOException e) {
            e.printStackTrace();
            throw new BusinessException(JcApiCodes.CROP_PIC_ERROR);
        }
    }

首先,我们使用ImageIO将图片流读取为BufferedImage,然后调用getSubimage(int x, int y, int widht, int height)方法获取子图,并通过ImageIO.write将子图写入输出流。

那么如何理解这里的x, y 以及 width,height呢。

裁剪坐标的理解

以下图为例:
image.png

这张图片的分辨率是:863 x 50,1/16大小的子图分辨率大约是 216 x 127

  1. 首先,我们尝试以x = 0, y = 0 来裁剪:
cropQrCode(new FileInputStream(filePath), 0, 0, 216, 127);

裁剪结果如下:
test2.jpg

因此,可以确定,x, y的原点位于图片的左上角。

  1. 再次尝试 x = 216, y = 0 来裁剪,结果如下图,可以得出结论,x是向右的横坐标.

test3.jpg

  1. x = 0, y = 127
    test4.jpg

通过以上三次尝试,可以得出,图片的坐标情况如下图所示:
Pasted image 20241016185917.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。