图像裁剪即截取原始图像某一部分生成一幅新的图像,某些app也会要求用户将上传图像进行一定程度裁剪来作为头像。图像裁剪实现起来比较简单,下面介绍两种裁剪方式,矩形裁剪和圆形裁剪。

矩形裁剪,定义图像上某个坐标(x,y)作为裁剪起始位置,xLength和yLength作为水平方向和垂直方向裁剪长度。由于裁剪范围可能超限,即裁剪起始位置到裁剪长度超过原始图像图像范围,需要判断(x+xLength)是否大于图像宽width。

圆形裁剪,定义图像上某个坐标(x,y)作为圆心,设定裁剪半径radius。判断横坐标是否超限,以radius是否大于圆心x和x+radius是否大于图像宽度作为条件,如果超限,再判断是圆心左侧还是右侧,最后以最小值对radius重新赋值。纵坐标以同样方式判断是否超限,并确定是否对radius重新赋值。

完整代码如下:

public class ImageCut {/*** 矩形裁剪,设定起始位置,裁剪宽度,裁剪长度* 裁剪范围需小于等于图像范围* @param image* @param xCoordinate* @param yCoordinate* @param xLength* @param yLength* @return*/public BufferedImage imageCutByRectangle(BufferedImage image, int xCoordinate, int yCoordinate, int xLength,int yLength) {//判断x、y方向是否超过图像最大范围if((xCoordinate + xLength) >= image.getWidth()) {xLength = image.getWidth() - xCoordinate;}if ((yCoordinate + yLength) >= image.getHeight()) {yLength = image.getHeight() - yCoordinate;}BufferedImage resultImage = new BufferedImage(xLength, yLength, image.getType());for (int x = 0; x < xLength; x++) {for (int y = 0; y < yLength; y++) {int rgb = image.getRGB(x + xCoordinate, y + yCoordinate);resultImage.setRGB(x, y, rgb);}}return resultImage;}/*** 圆形裁剪,定义圆心坐标,半径* 裁剪半径可以输入任意大于零的正整数* @param image* @param xCoordinate* @param yCoordinate* @param radius* @return*/public BufferedImage imageCutByCircle(BufferedImage image, int xCoordinate, int yCoordinate, int radius) {//判断圆心左右半径是否超限if ((xCoordinate + radius) > image.getWidth() || radius > xCoordinate) {int a = image.getWidth() - 1 - xCoordinate;if (a > xCoordinate) {radius = xCoordinate;}else {radius = a;}}//判断圆心上下半径是否超限if ((yCoordinate + radius) > image.getHeight() || radius >yCoordinate) {int a = image.getHeight() - 1 - yCoordinate;if (a > yCoordinate) {radius = yCoordinate;}else {radius = a;}}int length = 2 * radius + 1;BufferedImage resultImage = new BufferedImage(length, length, image.getType());for (int i = 0; i < length; i++) {for (int j = 0; j < length; j++) {int x = i - radius;int y = j - radius;int distance = (int) Math.sqrt(x * x + y * y);if (distance <= radius) {int rgb = image.getRGB(x + xCoordinate, y + yCoordinate);resultImage.setRGB(i, j, rgb);}}}return resultImage;}public static void main(String[] args) throws Exception {File input = new File("C:/Users/admin/Desktop/1.jpg");File output = new File("C:/Users/admin/Desktop/3.jpg");BufferedImage image = ImageIO.read(input);BufferedImage result = new ImageCut().imageCutByCircle(image, 80, 80, 80);ImageIO.write(result, "jpg", output);}
}

测试一下

原图:

矩形裁剪:

圆形裁剪:

java图像处理之图像裁剪相关推荐

  1. OpenCV图像处理--将图像裁剪为圆形

    1,需求 为了便于项目前端展示用户头像,需要将头像处理为圆形,非圆形区域设置为透明.其实,前端可以在显示的时候处理,但是前端采用WebGL,暂时搞不定,所以由后端进行图像的一次性加工. 于是,我们尝试 ...

  2. java图像处理之图像融合

    图像融合,把像素大小相同,拍摄位置相同的照片通过一定方式进行融合.下面介绍几种简单的图像融合方式. 1.通过对应像素均值进行融合.这种融合方式可用于处理亮度变换较大的图片,由于相机测光和成像水平有限, ...

  3. Java OpenCV-4.0.0 图像处理22 图像模板匹配

    Java OpenCV-4.0.0 图像处理22 图像模板匹配 参考链接:https://blog.csdn.net/qq_34814092/article/details/95813654 Java ...

  4. Java 图像处理教程(人脸检测,添加水印,图像颜色转换)

    Java 图像处理教程(人脸检测,添加水印,图像颜色转换) 文章目录 Java 图像处理教程(人脸检测,添加水印,图像颜色转换) 1:图片的读和写 2:彩色图像转换成灰度图像 3:彩色图像转换成负图像 ...

  5. java imageio处理图像_Linux geoserver调优之Java图像处理优化(原生JAI和ImageIO和java默认库相互转换)...

    注:geoserver 版本 Linux geoserver2.15.0    安装 :bin方式安装(内嵌jetty,非war安装) 一.geoserver调优之Java图像处理优化 1.原生JAI ...

  6. Java图像处理方面的工具库和开发包

    Java图像处理类库Java Image Filters Java Image Filters 是由 Jhlabs 开发的一组用来处理 Java 图像的类库,提供各种常用的图像处理效果,例如反转色.扭 ...

  7. Java中实现图像的卷积效果

    ** Java中实现图像的卷积效果 ** 图像的卷积: 指的是使用一个卷积核(kernel)对图像中的每一个像素进行一些列操作.卷积核(算子)是用来做图像处理时的矩阵,图像处理时也称为掩膜,是于原图像 ...

  8. Java OCR tesseract 图像智能字符识别技术 Java实现

    Java OCR tesseract 图像智能字符识别技术 Java代码实现 接着上一篇OCR所说的,上一篇给大家介绍了tesseract 在命令行的简单用法,当然了要继承到我们的程序中,还是需要代码 ...

  9. html图片自动剪裁,HTML canvas图像裁剪

    canvas drawImage方法的图像裁剪理解可能会比较耗时,记录一下,以便供人翻阅! context.drawImage(img,sx,sy,swidth,sheight,x,y,width,h ...

最新文章

  1. matplotlb.finance导包报错——ModuleNotFoundError No module named mpl finance
  2. python资料下载-Python大量学习资料集锦(全部免费下载)
  3. stone/reverse/string/digit(完美消除)
  4. 获取控件坐标位置一直是0
  5. porting linux
  6. Spring Boot笔记-JPA自定义SQL语句参数为对象时如何操作
  7. Focal Loss 的Pytorch 实现以及实验
  8. JDK源码系列(2)-Object类
  9. 快速排序算法实现:单向扫描法双向扫描法三分法(有相同元素)
  10. 代码管理学:域名、产品名、应用名等都不是你能决定的,要上报备案
  11. 【笔记】《Web全栈工程师的自我修养》
  12. 强大的网页数据库管理工具Adminer
  13. Cisco ISO 计划命令 kron实现配置定时自动备份
  14. 【js获取当天时间0点和23点59分59秒】
  15. 计算机双机对连局域网,图解双机/多机无线互联技巧_局域网教程
  16. 带有神经网络的梯度消失(Vanishing gradients with RNNs)
  17. android 通知静音_如何使电话静音(但不包括短信和通知)
  18. 凸优化、轨迹优化、最优控制
  19. SkyWalking 吴晟:好的开源项目,要能解决真实且有共性的问题
  20. 市场调研-全球与中国沉鱼饲料市场现状及未来发展趋势

热门文章

  1. Promise第三篇:async和await关键字
  2. 别翻了,成员变量和局部变量在多线程中的使用,看这篇就够了
  3. 【一起去大厂系列】深入理解MySQL中where 1 = 1的用处
  4. 列出连通集 (25 分)【DFS与BFS模板】
  5. 【19行代码AC,简洁】1029 Median (25 分)
  6. 4行代码满分:L1-052 2018我们要赢 (5分)
  7. 大话synchronize底层原理
  8. LeetCode题库第2题 两数相加
  9. 网络的分层思想和数据封装与解封装概论
  10. PHP包含文件函数include、include_once、require、require_once区别