java图像处理之图像裁剪
图像裁剪即截取原始图像某一部分生成一幅新的图像,某些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图像处理之图像裁剪相关推荐
- OpenCV图像处理--将图像裁剪为圆形
1,需求 为了便于项目前端展示用户头像,需要将头像处理为圆形,非圆形区域设置为透明.其实,前端可以在显示的时候处理,但是前端采用WebGL,暂时搞不定,所以由后端进行图像的一次性加工. 于是,我们尝试 ...
- java图像处理之图像融合
图像融合,把像素大小相同,拍摄位置相同的照片通过一定方式进行融合.下面介绍几种简单的图像融合方式. 1.通过对应像素均值进行融合.这种融合方式可用于处理亮度变换较大的图片,由于相机测光和成像水平有限, ...
- Java OpenCV-4.0.0 图像处理22 图像模板匹配
Java OpenCV-4.0.0 图像处理22 图像模板匹配 参考链接:https://blog.csdn.net/qq_34814092/article/details/95813654 Java ...
- Java 图像处理教程(人脸检测,添加水印,图像颜色转换)
Java 图像处理教程(人脸检测,添加水印,图像颜色转换) 文章目录 Java 图像处理教程(人脸检测,添加水印,图像颜色转换) 1:图片的读和写 2:彩色图像转换成灰度图像 3:彩色图像转换成负图像 ...
- java imageio处理图像_Linux geoserver调优之Java图像处理优化(原生JAI和ImageIO和java默认库相互转换)...
注:geoserver 版本 Linux geoserver2.15.0 安装 :bin方式安装(内嵌jetty,非war安装) 一.geoserver调优之Java图像处理优化 1.原生JAI ...
- Java图像处理方面的工具库和开发包
Java图像处理类库Java Image Filters Java Image Filters 是由 Jhlabs 开发的一组用来处理 Java 图像的类库,提供各种常用的图像处理效果,例如反转色.扭 ...
- Java中实现图像的卷积效果
** Java中实现图像的卷积效果 ** 图像的卷积: 指的是使用一个卷积核(kernel)对图像中的每一个像素进行一些列操作.卷积核(算子)是用来做图像处理时的矩阵,图像处理时也称为掩膜,是于原图像 ...
- Java OCR tesseract 图像智能字符识别技术 Java实现
Java OCR tesseract 图像智能字符识别技术 Java代码实现 接着上一篇OCR所说的,上一篇给大家介绍了tesseract 在命令行的简单用法,当然了要继承到我们的程序中,还是需要代码 ...
- html图片自动剪裁,HTML canvas图像裁剪
canvas drawImage方法的图像裁剪理解可能会比较耗时,记录一下,以便供人翻阅! context.drawImage(img,sx,sy,swidth,sheight,x,y,width,h ...
最新文章
- matplotlb.finance导包报错——ModuleNotFoundError No module named mpl finance
- python资料下载-Python大量学习资料集锦(全部免费下载)
- stone/reverse/string/digit(完美消除)
- 获取控件坐标位置一直是0
- porting linux
- Spring Boot笔记-JPA自定义SQL语句参数为对象时如何操作
- Focal Loss 的Pytorch 实现以及实验
- JDK源码系列(2)-Object类
- 快速排序算法实现:单向扫描法双向扫描法三分法(有相同元素)
- 代码管理学:域名、产品名、应用名等都不是你能决定的,要上报备案
- 【笔记】《Web全栈工程师的自我修养》
- 强大的网页数据库管理工具Adminer
- Cisco ISO 计划命令 kron实现配置定时自动备份
- 【js获取当天时间0点和23点59分59秒】
- 计算机双机对连局域网,图解双机/多机无线互联技巧_局域网教程
- 带有神经网络的梯度消失(Vanishing gradients with RNNs)
- android 通知静音_如何使电话静音(但不包括短信和通知)
- 凸优化、轨迹优化、最优控制
- SkyWalking 吴晟:好的开源项目,要能解决真实且有共性的问题
- 市场调研-全球与中国沉鱼饲料市场现状及未来发展趋势
热门文章
- Promise第三篇:async和await关键字
- 别翻了,成员变量和局部变量在多线程中的使用,看这篇就够了
- 【一起去大厂系列】深入理解MySQL中where 1 = 1的用处
- 列出连通集 (25 分)【DFS与BFS模板】
- 【19行代码AC,简洁】1029 Median (25 分)
- 4行代码满分:L1-052 2018我们要赢 (5分)
- 大话synchronize底层原理
- LeetCode题库第2题 两数相加
- 网络的分层思想和数据封装与解封装概论
- PHP包含文件函数include、include_once、require、require_once区别