Java中如何裁剪图片
需求来源
最近工作中,遇到一个需求,用户有固定格式的图片,在指定位置有一个二维码。在没有上架系统之前,用户每次都需要使用截图工具,手动将二维码选中,然后保存,再粘贴到文件的指定位置上去,操作十分的繁琐、耗时耗力。
因此,需要我们软件系统提供一个工具来方便的将图片中的二维码裁剪下来,保存,并将二维码附到指定文件的指定位置。
本文单纯说图片裁剪的问题。
深入了解了一下用户需求,用户的图片都是固定软件产生的,二维码的位置都是固定的,因此,每张图片中,二维码的坐标与大小都是固定的。基于此判断,我们不需要使用二维码识别软件,只需要按照坐标与大小,将图片指定位置的图剪切出来即可。
裁剪工具
我们使用的工具是java.awt.image.BufferedImage
,BufferedImage
是一个带缓冲区的图像类,它实现了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呢。
裁剪坐标的理解
以下图为例:
这张图片的分辨率是:863 x 50,1/16大小的子图分辨率大约是 216 x 127
- 首先,我们尝试以x = 0, y = 0 来裁剪:
cropQrCode(new FileInputStream(filePath), 0, 0, 216, 127);
裁剪结果如下:
因此,可以确定,x, y的原点位于图片的左上角。
- 再次尝试 x = 216, y = 0 来裁剪,结果如下图,可以得出结论,x是向右的横坐标.
- x = 0, y = 127
通过以上三次尝试,可以得出,图片的坐标情况如下图所示:
- 点赞
- 收藏
- 关注作者
评论(0)