BufferedImage将图片切成圆形

news2024/11/20 18:22:55

 原图

 

 修改后

 

方法一

//文件路径
File imageFile = new File(path);

 

 public  BufferedImage changeImages(File imageFile) {
	        BufferedImage  avatarImage = null;
	        try {
	        	avatarImage = ImageIO.read(imageFile);
avatarImage = scaleByPercentage(avatarImage, avatarImage.getWidth(),  avatarImage.getWidth());
 int width = avatarImage.getWidth();
	        	 
	            // 透明底的图片  
	            BufferedImage formatAvatarImage = new BufferedImage(avatarImage.getWidth(), avatarImage.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
	            Graphics2D graphics = formatAvatarImage.createGraphics();
	            //把图片切成一个园
	            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
	            //留一个像素的空白区域,这个很重要,画圆的时候把这个覆盖
	            int border = 1;
	          //图片是一个圆型
	            Ellipse2D.Double shape = new Ellipse2D.Double(border, border, width - border * 2, width - border * 2);
	          //需要保留的区域
	            graphics.setClip(shape);
	            graphics.drawImage(avatarImage, border, border, width - border * 2, width - border * 2, null);
	            //在圆图外面再画一个圆
	            //新创建一个graphics,这样画的圆不会有锯齿
//	            graphics = formatAvatarImage.createGraphics();
//	            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//	            int border1 = 3;
//	            //画笔是4.5个像素,BasicStroke的使用可以查看下面的参考文档
//	            //使画笔时基本会像外延伸一定像素,具体可以自己使用的时候测试
//	            Stroke s = new BasicStroke(5F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
//	            graphics.setStroke(s);
//	            graphics.setColor(Color.WHITE);
//	            graphics.drawOval(border1, border1, width - border1 * 2, width - border1 * 2);
//	            graphics.dispose();
//	          
	            return formatAvatarImage;
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        return null;
	    }
/**
     * 缩小Image,此方法返回源图像按给定宽度、高度限制下缩放后的图像
     *
     * @param inputImage
     *            :压缩后宽度
     *            :压缩后高度
     * @throws java.io.IOException
     *             return
     */
    public BufferedImage scaleByPercentage(BufferedImage inputImage, int newWidth, int newHeight){
        // 获取原始图像透明度类型
        try {
            int type = inputImage.getColorModel().getTransparency();
            int width = inputImage.getWidth();
            int height = inputImage.getHeight();
            // 开启抗锯齿
            RenderingHints renderingHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            // 使用高质量压缩
            renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            BufferedImage img = new BufferedImage(newWidth, newHeight, type);
            Graphics2D graphics2d = img.createGraphics();
            graphics2d.setRenderingHints(renderingHints);
            graphics2d.drawImage(inputImage, 0, 0, newWidth, newHeight, 0, 0, width, height, null);
            graphics2d.dispose();
            return img;
 
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

方法二

String url = "https://www.pngall.com/wp-content/uploads/13/Christmas-Golden-Bell-PNG-Photo.png";
		BufferedImage avatarImage = ImageIO.read(new URL(url));
//		 avatarImage = scaleByPercentage(avatarImage, avatarImage.getWidth(),  avatarImage.getWidth());
         int width = 120;
		// 透明底的图片
		BufferedImage formatAvatarImage = new BufferedImage(width, width, BufferedImage.TYPE_4BYTE_ABGR);
		Graphics2D graphics = formatAvatarImage.createGraphics();
		// 把图片切成一个圓
		{
			graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			// 留一个像素的空白区域,这个很重要,画圆的时候把这个覆盖
			int border = 1;
			// 图片是一个圆型
			Ellipse2D.Double shape = new Ellipse2D.Double(border, border, width - border * 2, width - border * 2);
			// 需要保留的区域
			graphics.setClip(shape);
			graphics.drawImage(avatarImage, border, border, width - border * 2, width - border * 2, null);
			graphics.dispose();
		}
		// 在圆图外面再画一个圆
		{
			// 新创建一个graphics,这样画的圆不会有锯齿
			graphics = formatAvatarImage.createGraphics();
			graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			int border = 3;
			// 画笔是4.5个像素,BasicStroke的使用可以查看下面的参考文档
			// 使画笔时基本会像外延伸一定像素,具体可以自己使用的时候测试
			Stroke s = new BasicStroke(4.5F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
			graphics.setStroke(s);
			graphics.setColor(Color.WHITE);
			graphics.drawOval(border, border, width - border * 2, width - border * 2);
			graphics.dispose();
		}
		try (OutputStream os = new FileOutputStream("d:/temp-avatar.png")) {
			ImageIO.write(formatAvatarImage, "PNG", os);
		}
		{
			url = "https://img-blog.csdn.net/20180529213113521";
			BufferedImage srcImg = ImageIO.read(new URL(url));
			// scrImg加载完之后没有任何颜色
			BufferedImage blankImage = new BufferedImage(srcImg.getWidth(), srcImg.getHeight(),
					BufferedImage.TYPE_INT_RGB);
			graphics = blankImage.createGraphics();
			graphics.drawImage(srcImg, 0, 0, null);

			int x = (blankImage.getWidth() - width) / 2;
			int y = (blankImage.getHeight() - width) / 2;
			graphics.drawImage(formatAvatarImage, x, y, width, width, null);
			try (OutputStream os = new FileOutputStream("d:/temp-avatar.png")) {
				ImageIO.write(blankImage, "PNG", os);
			}
		}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LENOVO联想笔记本电脑ThinkBook 15 G2-ITL(20VE)原装出厂Windows10系统恢复原厂OEM设置预装系统

Lenovo联想笔记本电脑,ThinkBook 15 G2-ITL(20VE)出厂Windows10系统,出厂预装系统 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式:ISO 文件大小&#xf…

最优化--凸函数--拉格朗日乘子法

目录 凸函数 凸函数定义 凸函数的判定 性质特点 拉格朗日乘子法 基本思想 有约束最优化问题 拉格朗日乘子法 凸函数 凸函数(Convex Function)是定义在凸集上的实值函数,具有以下性质:对于任意两个定义域内的点&#xf…

Windows11系统启动VMware Workstation 在此主机上不支持嵌套虚拟化导致无法启动虚拟机

问题复现: VMware Workstation中的虚拟机时启动失败,弹出错误弹窗: VMware Workstation 在此主机上不支持嵌套虚拟化。 模块“MonitorMode”启动失败。 未能启动虚拟机。 问题原因: 不要同时开启hyper-V和VMware虚拟机软件&…

(小程序)指定问题换一批功能实现

(小程序)指定问题换一批功能实现 vue3写法 html <view class"title"><p>推荐问题</p><view class"refresh" click"onRefresh"><text>换一批</text><image src"https://cdn.tudb.work/aios/web/im…

MongoDB的数据类型

BSON JSON作为一种轻量级的数据交换格式&#xff0c;JSON的可读性非常好&#xff0c;而且非常便于系统生成和解析&#xff0c;这些优势也让它逐渐取代了XML标准在Web领域的地位&#xff0c;当今许多流行的Web应用开发框架&#xff0c;如SpringBoot都选择了JSON作为默认的数据编…

007+limou+C语言基础排序算法(上)

0.前言 您好这里是limou3434的一篇博文&#xff0c;感兴趣可以看看我的其他内容。 排序算法简单理解就是&#xff1a;一串数组经过排序算法后得到有序的数组。排序算法在不同应用场景有不同的效果&#xff0c;因此我们有必要了解一些基础的排序算法。 而本次我给您带来的是一…

vue+leaflet实现聚合图(根据半径划分)

效果 官方示例 github地址 1. 安装leaflet.markercluster插件 npm install leaflet.markercluster -S** 2. 在项目中引入leaflet.markercluster和样式文件 ** import leaflet.markercluster/dist/MarkerCluster.css import leaflet.markercluster/dist/MarkerCluster.Def…

SqlServer定时执行存储过程

1.连接数据库后选择【SQL Server 代理】—【作业】——右键【新建作业】&#xff0c;具体操作如下图&#xff1a; 2.【新建作业】步骤如下图所示&#xff1a; 3.新建【步骤】&#xff0c;具体如下图所示&#xff1a; 4.新建【计划】&#xff0c;具体如下图所示&#xff1a; 6.配…

Ubuntu 20.04 下g++用不了,但是提示已经安装

问题描述 用sudo apt-get install g来安装&#xff0c;系统却又说g已经是最新版本了&#xff0c;但是用g -v查看又提示需要安装 g&#xff0c;如图片所示。 解决方法 未安装g&#xff0c;安装依赖只需运行命令行&#xff1a; sudo apt-get install build-essential仍然无法成…

docker部署redis

一、拉取镜像 docker search redis 我部署的是redis6.0&#xff0c;使用docker pull 拉取镜像 docker pull redis:6.0 拉取成功后使用docker image查看镜像 docker images | grep redis 二、创建挂载目录 在 /opt 目录下创建redis的 conf 和 data 目录 sudo mkdir /opt/re…

YOLOv5 环境安装

Windows11下yolov5环境配置系列教程&#xff08;基础部分&#xff09; Windows11下yolov5环境配置系列教程&#xff08;基础部分&#xff09;_wnowswolf的博客-CSDN博客 安装 Anaconda3 可以改为miniconda 占用更小 将安装目录下的Scripts和condabin文件夹的路径加入环境变…

linux重启网卡失败

[TO简单粗暴啊&#xff1a; RTNETLINK answers: File exists 这个报错&#xff0c;我看了一下网卡目录下出现了两个网卡配置文件&#xff0c;一个ens33&#xff0c;一个eth0。我本机是ens33&#xff0c;所以把eth0的删除了&#xff0c;就可以了。我这个是测试机器&#xff0c;…

人脸识别是什么?及人脸识别的流程

目录 1. 人脸识别是什么及应用场景2. 人脸识别的组成2.1 前端图像采集2.2 后端智能平台 3.人脸技术的流程3.1人脸检测3.2人脸对齐3.2.1仿射变换3.2.2对齐方法 3.3人脸编码&#xff08;提取特征向量&#xff09;3.4人脸分类 1. 人脸识别是什么及应用场景 人脸识别特指利用分析比…

什么是 frp内网穿透?快解析内网穿透如何实现远程办公?

1.什么是frp内网穿透 frp是一个开源、简洁易用、高性能的内网穿透和 反向代理软件&#xff0c;支持 tcp, udp, http, https等协议&#xff0c;虽然它体积轻量但功能很强大。它利用处于内网或防火墙后的机器&#xff0c;对外网环境提供 http 或 https 服务&#xff1b;对于 htt…

python项目在linux中的启动脚本(shell脚本)

背景&#xff1a; 在linux环境&#xff0c;使用shell脚本&#xff0c;实现对某个服务的启动、停止功能。 shell脚本的功能&#xff1a; 启动&#xff08;start&#xff09;&#xff1a;通过参数 start &#xff0c;实现启动服务。如果该服务已经启动&#xff0c;给出已经启动…

2023年江西省研究生数模竞赛国际“合作-冲突”的演化规律研究

2023年江西省研究生数模竞赛 国际“合作-冲突”的演化规律研究 原题再现 国家之间的“合作-冲突”行为具有复杂性和多变性&#xff0c;对其决策模式的研究有着重要的意义。例如&#xff0c;对国际冲突和危机的准确预测可以帮助决策者采取有效的措施来防止或缓解冲突&#xff…

都是全志T113处理器,“-i”和“-S3”有什么区别?

自9个月前&#xff0c;创龙科技“1片含税就79元”的全志T113-i双核ARM Cortex-A71.2GHz的工业核心板(SOM-TLT113)推出之后&#xff0c;不少嵌入式软硬件工程师、用户都咨询我们&#xff0c;究竟T113-i和T113-S3这两款处理器有什么区别&#xff1f;不同后缀型号的处理器&#xf…

嵌入式芯片启动过程全解析,彻底理解bootloader

当你按下电源开关的那一瞬间&#xff0c;第一行代码&#xff0c;是如何在芯片上运行起来的呢&#xff1f; 我们都知道嵌入式软件代码&#xff0c;是需要通过一定的方式&#xff0c;烧录在硬件芯片中才能运行&#xff0c;而我们所熟知的烧录方式&#xff0c;除了物理刻蚀以外&a…

数据分析知识图谱

在做数据分析时&#xff0c;经常会有这样的困扰&#xff1a;面对几种相似的方法&#xff0c;既不清楚它们各自的使用场景&#xff0c;也无法分清它们之间的差别&#xff0c;一念之差就可能选错方法。如果你也有这样的困扰&#xff0c;建议按照SPSSAU知识图谱目录顺序检索对应的…

【万字】一文教会你关于“生成对抗网络GAN”的所有知识

1 GAN基本概念 1.1 GAN介绍 GAN的英文全称是Generative Adversarial Network&#xff0c;中文名是生成对抗网络。它由两个部分组成&#xff0c;生成器和鉴别器&#xff08;又称判别器&#xff09;&#xff0c;生成网络&#xff08;Generator&#xff09;负责生成模拟数据&…