图片马赛克处理(Java)
1.需求
- 给图片的指定区域打码
- 给整张图片打码
- 马赛克方格取色支持中心点取色和随机取色
- 马赛克支持灰度处理
2.源码
package com.visy.utils;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.util.Random;/*** @author visy.wang* @date 2024/9/19 9:56*/
public class ImageUtil {/*** 给图片指定区域打马赛克* @param x 打码区域左上角的横坐标* @param y 打码区域左上角的纵坐标* @param width 打码区域的宽度* @param height 打码区域的高度* @param size 马赛克格子尺寸,即每个正方形小方格的边长*/public static void mosaic(InputStream source, OutputStream target, int x, int y, int width, int height, int size) throws IOException {//读取该图片BufferedImage image = ImageIO.read(source);int imgWidth = image.getWidth(), imgHeight = image.getHeight();System.out.println("原图片尺寸:"+imgWidth+"*"+imgHeight);if(size<=0 || width==0 || height==0){//不打马赛克,直接返回原图ImageIO.write(image, "jpg", target);return;}//马赛克区域边界值处理width = width<0||width>imgWidth ? imgWidth : width;height = height<0||height>imgHeight ? imgHeight : height;//起点坐标<0处理x = Math.max(x, 0);y = Math.max(y, 0);//马赛克块大小 不能大于图片宽度和高度,超过时取宽高中小的那一个if (size > imgWidth || size > imgHeight) {size = Math.min(imgWidth, imgHeight);}//创建一张画布(和原图同尺寸,颜色类型选择RGB)BufferedImage canvas = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);//获得画布的画笔Graphics gs = canvas.getGraphics();//先将原图片画到画布上gs.drawImage(image, 0, 0, null);//计算横向和纵向绘制马赛克方格的个数int xCount = width/size + (width%size==0 ? 0 : 1); //横绘绘制个数int yCount = height/size + (height%size==0 ? 0 : 1); //纵向绘制个数//遍历指定区域的所有方格并填充int $x = x;//方格左上角x坐标for (int i = 0; i < xCount; i++) {int $y = y;//方格左上角y坐标//方格的宽度,横向最后一个方格的宽需单独处理int $width = i==xCount-1 ? (x+width-$x) : size;for (int j = 0; j < yCount; j++) {//方格的高度,纵向最后一个方格的高需单独处理int $height = j==yCount-1 ? (y+height-$y) : size;//颜色取方格中心像素点RGB值//int rgb = getCenterRgb($x, $y, $width, $height, image);//颜色取方格内随机像素点RGB值int rgb = getRandomRgb($x, $y, $width, $height, image);//设置颜色(灰度处理)//Color color = new Color(toGray(rgb));Color color = new Color(rgb);//设置颜色gs.setColor(color);//填充方格gs.fillRect($x, $y, $width, $height);//方格加边框(用于测试)//gs.setColor(Color.RED);//gs.drawRect($x, $y, $width, $height);$y += size;//计算下一个方格的左上角y坐标}$x += size;//计算下一行方格的左上角x坐标}gs.dispose(); //释放资源ImageIO.write(canvas, "jpg", target); // 保存图片}/*** 给整张图片打马赛克* @param source 原图输入流* @param target 打码后的图片输出流* @param size 马赛克格子尺寸,即每个正方形小方格的边长*/public static void mosaicAll(InputStream source, OutputStream target, int size) throws IOException {mosaic(source, target, 0, 0, -1, -1, size);}/*** 获取马赛克小方格中心点的颜色* @param x 小方格左上角横坐标* @param y 小方格左上角纵坐标* @param width 小方格的宽度* @param height 小方格的高度* @param image 原图* @return 颜色RGB值*/private static int getCenterRgb(int x, int y, int width, int height, BufferedImage image){//计算当前方格中心点位置int xCenterIndex = x + (width%2==0 ? width : width-1) / 2;int yCenterIndex = y + (height%2==0 ? height : height-1) / 2;//颜色取中心像素点RGB值return image.getRGB(xCenterIndex, yCenterIndex);}/*** 在马赛克小方格区域内随机取一个像素点的颜色* @param x 小方格左上角横坐标* @param y 小方格左上角纵坐标* @param width 小方格的宽度* @param height 小方格的高度* @param image 原图* @return 颜色RGB值*/private static int getRandomRgb(int x, int y, int width, int height, BufferedImage image){//在方格区域内随机取一个点的颜色Random random = new Random();int xIndex = x + random.nextInt(width);int yIndex = y + random.nextInt(height);return image.getRGB(xIndex, yIndex);}/*** 彩色转换成黑白* @param rgb 彩色RGB值* @return 黑白RGB值*/private static int toGray(int rgb){int r = (rgb >> 16) & 0xFF;int g = (rgb >> 8) & 0xFF;int b = rgb & 0xFF;// 计算灰度值int gray = (r + g + b) / 3;return (gray << 16) + (gray << 8) + gray;}/*** 创建目标(输出)文件* @param file 源文件* @return 目标文件*/private static File createTargetFile(File file){String name = file.getName();String newName = name.substring(0, name.lastIndexOf("."))+"_mosaic.jpg";return new File(file.getParent(), newName);}public static void mosaic(File file, int x, int y, int width, int height, int size) throws IOException {InputStream in = Files.newInputStream(file.toPath());OutputStream out = Files.newOutputStream(createTargetFile(file).toPath());mosaic(in, out, x, y, width, height, size);}public static void mosaicAll(File file, int size) throws IOException {InputStream in = Files.newInputStream(file.toPath());OutputStream out = Files.newOutputStream(createTargetFile(file).toPath());mosaicAll(in, out, size);}public static void main(String[] args) throws IOException {File f = new File("E:\\test\\imgs\\2d6aa7e497a059df30d635667b1ec998.jpeg");//mosaic(f, 20 , 560, 500, 150, 10);mosaic(f,370, 241, 370, 245, 15);System.out.println("处理完成");}
}
3.输入输出
- 处理前

- 处理后(中心点取色)

- 处理后(灰度处理)

- 处理后(随机取色)


相关文章:
图片马赛克处理(Java)
1.需求 给图片的指定区域打码给整张图片打码马赛克方格取色支持中心点取色和随机取色马赛克支持灰度处理 2.源码 package com.visy.utils;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOE…...
python+selenium实现自动联网认证,并实现断网重连
pythonselenium实现自动联网认证,并实现断网重连 echo off python “E:\autoD\auto_login.py” 要使自动登录脚本在系统重启后自动运行,你可以使用Windows的任务计划程序来设置。以下是详细的步骤: 1. 保存脚本 首先,将你的Py…...
基于机器学习的注意力缺陷/多动障碍 (ADHD)(python论文+代码)HYPERAKTIV
简述 医疗保健领域的机器学习研究往往缺乏完全可重复性和可比性所需的公共数据。由于患者相关数据附带的隐私问题和法律要求,数据集往往受到限制。因此,许多算法和模型发表在同一主题上,没有一个标准的基准。因此,本文提出了一个公…...
Spring Boot 集成 Redisson 实现消息队列
包含组件内容 RedisQueue:消息队列监听标识RedisQueueInit:Redis队列监听器RedisQueueListener:Redis消息队列监听实现RedisQueueService:Redis消息队列服务工具 代码实现 RedisQueue import java.lang.annotation.ElementTyp…...
go语言Map详解
Map Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现 map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。 它提供了高效的查找、插入和删除操作,非常适…...
C++——已知数组a[6]={1,3,5,7,9};输入一个数值,要求按照现有排序规律将它放入数组当中。
没注释的源代码 #include <iostream> using namespace std; int main() { int a[6]{1,3,5,7,9}; int n,i,j; cout<<"请输入一个数值:"; cin>>n; for(int i0;i<4;i) { if(n<a[i]) { …...
云计算第四阶段---CLOUD Day7---Day8
CLOUD 07 一、Dockerfile详细解析 指令说明FROM指定基础镜像(唯一)RUN在容器内执行命令,可以写多条ADD把文件拷贝到容器内,如果文件是 tar.xx 格式,会自动解压COPY把文件拷贝到容器内,不会自动解压ENV设置…...
深入解析ThingsBoard与ThingsKit物联网平台的差异
VS 在物联网(IoT)领域,平台的选择对于企业来说至关重要。本文将深入探讨ThingsBoard社区版与ThingsKit企业版这两个物联网平台的差异,帮助读者更好地理解它们的特色和适用场景。 系统相同点 首先,ThingsBoard社区版和ThingsKit企业版都基于…...
五、CAN总线
目录 一、基础知识 1、can介绍 2、CAN硬件电路 3、CAN电平标准 4、CAN收发器芯片介绍 5、CAN帧格式 ① CAN帧种类 ② CAN数据帧 ③ CAN遥控帧编辑 ④ 位填充 ⑤ 波形实例 6、接收方数据采样 ① 接收方数据采样遇到的问题 ② 位时序 ③ 硬同步 ④ 再同步 ⑤ 波…...
Linux:终端(terminal)与终端管理器(agetty)
终端的设备文件 打开/dev目录可以发现其中有许多字符设备文件,例如对于我的RedHat操作系统,拥有tty0到tty59,它们是操作系统提供的终端设备。对于tty1-tty12使用ctrlaltF*可以进行快捷切换,下面的命令可以进行通用切换。 sudo ch…...
钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句
钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句 接入系统:钉钉 钉钉是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工…...
微信小程序点赞动画特效实现
这里提供两种实现点赞动画特效的方法: 方法一:使用 CSS 动画 wxml 文件: <view class"like-container"><image src"{{isLiked ? likedImg : unlikedImg}}" class"like-icon {{isLiked ? liked : }}" bindta…...
Day25笔记-普通文件读写with上下文二进制文件csv文件
一、文件读写【重点掌握】 常见文件的读写分类: 1.普通文件文件,如txt,py,html等 2.二进制文件,如图片,音频,视频,压缩包等 3.csv文件,如csv,需要借助于系统模块csv 4.对…...
MySQL安装教程
MySQL安装教程 如果需要删除原有mysql,然后安装过新的,可以参照如何彻底卸载旧mysql重装测试 1. 准备资源 mysql官网直达:https://dev.mysql.com/downloads/mysql/ CADN:https://download.csdn.net/download/luocong321/89592962 …...
【Windows】快速帮你解决如何找到 Windows 上的 .condarc 文件
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...
『正版软件』XYplorer 专业的 Windows 文件管理工具软件
在数字化时代,我们每天都在与各种文件打交道。无论是工作文档、个人照片还是多媒体资料,管理这些文件的效率直接关系到我们的工作效率和生活体验。今天,我要向大家推荐一款功能强大、操作简便的文件管理软件 —— XYplorer。 XYplorer&#x…...
“吉林一号”宽幅02B系列卫星
离轴四反光学成像系统 1.光学系统参数: 焦距:77.5mm; F/#:7.4; 视场:≥56゜; 光谱范围:400nm~1000nm。 2.说明: 光学系统采用离轴全反射式结构,整…...
我的AI工具箱Tauri版-FasterWhisper音频转文本
本教程基于自研的AI工具箱Tauri版进行FasterWhisper音频转文本服务。 FasterWhisper音频转文本服务 是自研AI工具箱Tauri版中的一款模块,专门用于将音频或视频中的语音内容自动转化为文本或字幕。通过简单的配置,该工具能够批量处理大量音频或视频文件&…...
Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略
Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在后端开发中,延迟队列(Delayed Queue)…...
Linux中使用cp命令的 -f 选项,但还是提醒覆盖的问题
问题: linux 在执行cp的命令的时候,就算是执行 cp -f 也还是会提醒是否要进行替换。 问题原因: 查看别名,alias命令,看到cp的别名为cp -i,那就是说cp本身就是自带覆盖提醒,就算我们加上-f 的…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
