一、需求

工作中需要将一张前端传过来的图片按照16:9的比例裁剪

二、步骤

1、通过ImageIO工具类读取网络、本地、或内存中的图片, 返回一个BufferedImage对象实例

BufferedImage类是Image抽象类的实现类,作用是将一个图片加载到内存中,它会在内存中有个图像缓冲区,利用缓冲区对图像做操作。

BufferedImage bufImage = ImageIO.read(InputStream input);

2、使用BufferedImage的相关API操作图片

int width = src.getWidth();//获得宽度
int height = src.getHeight();//获得高度
/*** 裁剪图片, 参数说明:*     x: 裁剪起点横坐标*     y: 裁剪起点纵坐标*     w: 需要裁剪的宽度*     h: 需要裁剪的高度*/
BufferedImage getSubimage (int x, int y, int w, int h);

3、操作后的图片保存

ByteArrayOutputStream os = new ByteArrayOutputStream();
//保存图片
/*** 保存 bufImage, 参数说明:*     im: bufImage 本身, BufferedImage 实现了 RenderedImage 接口*     formatName: 保存的图片格式*     output: 结果输出位置*/
ImageIO.write(src, name.substring(name.lastIndexOf(".") + 1), os);
os.close();
return new ByteArrayInputStream(os.toByteArray());

4、上传裁剪后的图片到oss

三、代码示例

//裁剪人脸图片public static InputStream cutPicture(InputStream inputStream, String name) {ByteArrayOutputStream os = null;BufferedImage src=null;try {int w, h = 0;log.info("*****************************读取");src = ImageIO.read(inputStream);ImageIO.setUseCache(false);int width = src.getWidth();int height = src.getHeight();log.info("***********width:{},height:{}",width,height);float fw = (float) width;float fh = (float) height;float number = fw / fh;if (number != (16.0 / 9.0)) {if (number > (16.0 / 9)) {w = height * 16 / 9;h = height;} else {w = width;h = width * 9 / 16;}src = src.getSubimage((width - w) / 2, (height - h) / 2, w, h);}os = new ByteArrayOutputStream();//保存图片boolean write = ImageIO.write(src, name.substring(name.lastIndexOf(".") + 1), os);ImageIO.setUseCache(false);//关闭图片对象资源src.getGraphics().dispose();if (write){byte[] bytes = os.toByteArray();return new ByteArrayInputStream(bytes);} else {throw new PlatformException("裁剪失败!");}} catch (IOException e) {log.error("操作图片出错:" + e.getMessage());} finally {try {if (inputStream != null) {inputStream.close();}if (os != null) {os.close();}if(src!=null){src.getGraphics().dispose();}} catch (IOException e) {log.error("关闭流失败",e);}}return null;}

注意:使用BufferedImage操作图片需要将图片加载到内存中,如果图片过大或者多个线程来请求,很容易发生内存溢出的问题。可以使用ImageMaigck+Im4java来裁剪。可以参考博主另一篇:ImageMagick+Im4Java裁剪图片

Java使用BufferedImage裁剪图片相关推荐

  1. java保存当前页面为图片大小_java用BufferedImage转换图片大小并保存

    java用BufferedImage转换图片大小并保存,保存的图片总是一片黑色 程序实现将一个图片缩小成256*256像素图片并保存,源图片为jpg格式,但是每次转换后存在文件夹中的文件均为一片黑色, ...

  2. registerForActivityResult请求权限/拍照/选取视频图片/裁剪图片

    权限相关 //近似定位(模糊定位) Manifest.permission.ACCESS_COARSE_LOCATION //精确定位 Manifest.permission.ACCESS_FINE_ ...

  3. Java 通过BufferedImage缩放和裁剪图片

    通过BufferedImage对图片进行缩放和裁剪 读取图片 //读取图片 通过JAVA自带的ImageIO里面的read方法 BufferedImage bufImage = ImageIO.rea ...

  4. ImageUtils.java:图片处理工具类[裁剪/图片水印/文字水印/缩放补白/Base64加密解密]

    用到的jar包: commons-beanutils-1.8.0.jar commons-codec-1.10.jar package com.zhenzhigu.commons.util;   im ...

  5. Java工具类 - 根据左上角坐标和右下角坐标裁剪图片

    package cut;import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;import javax.imageio.ImageI ...

  6. Java使用thumbnailator进行图片压缩缩放裁剪水印旋转处理

    Java使用thumbnailator进行图片压缩缩放裁剪水印旋转处理 一.thumbnailator介绍 二.使用步骤 1.maven的pom.xml引入如下 2.测试代码 一.thumbnaila ...

  7. java -- cropper裁剪图片并base64上传 移动端简单示例

    前言 cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. cropper有两种方式 ...

  8. Java使用ImageMagick+Im4Java裁剪图片

    一.背景 BufferedImage是将图片整个加载到内存中的,而图片又比较大,可能有多个线程在转,所以会有内存溢出的问题.因而使用ImageMagick+Im4Java去裁剪图片 二.需求 将图片裁 ...

  9. javaWeb实现裁剪图片上传整套方案

    实现思路 使用jcrop插件手机要裁剪图片的坐标 将收集到的参数传递到后台,在后台使用java图形对象绘制图像进行裁剪  后台处理流程:  1.将上传的图片按按照比例进行压缩后上传到文件服务器,并且将 ...

  10. JavaWeb实现裁剪图片上传完整代码

    JavaWeb实现裁剪图片上传完整代码 这篇文章主要为大家详细介绍了javaWeb实现裁剪图片上传完整代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了JavaWeb实现裁剪 ...

最新文章

  1. Custom Client Side Drag and Drop Behavior in ASP.NET AJAX
  2. SQLServer中利用NTILE函数对数据进行分组的一点使用
  3. C++入门经典-例9.4-默认模板参数
  4. python自学流程-python 学习之 基础篇三 流程控制
  5. 深入理解 Java 虚拟机 学习笔记
  6. LinkedList插入元素一定比ArrayList快吗
  7. 网络通信tcp与udp的区别
  8. 在EI中查找某作者的会议论文是否被收录
  9. webpack打包优化之外部扩展externals的实际应用
  10. lombok slfj 中_lombok @Slf4j注解
  11. java opencv 阀值分割_利用OpenCV实现局部动态阈值分割
  12. ubuntu服务器文件权限设置密码,Ubuntu 开启 root 用户并开启 ssh 远程访问权限
  13. redis5.0.7集群搭建
  14. 如何将现有Apple ID 更改为美区
  15. 用.iso文件从硬盘安装redhatlinux7.3(转)
  16. MMDetection CenterNet 源码解析
  17. 【LDO带载能力和两端压差有关】
  18. 今年还能回家过年吗?查询下各地出行隔离政策
  19. capacity和capability的区别
  20. 新东方:俞敏洪从台前走入幕后

热门文章

  1. 跃见非凡!华为Mate40系列国内发布4999元起
  2. 读《王二的经济学故事》
  3. Java语言 Timer 定时器的四种使用方式
  4. 计算多边形中心点坐标的方法
  5. 下载加速小妙招,我不允许你不知道
  6. 画计算机乐谱,邓紫棋《画》简谱
  7. 分享:淘宝客完全开源程序。
  8. java第六章十七题_Java语言面试题十七
  9. 独立安装的黑莓模拟器的上网方法
  10. 光明勇士iOS服务器维护,裕际网络科技《光明勇士》3月11日 iOSamp;安卓部分区服数据互通公告 - 热门手游公告-TK游戏...