Java实现给图片局部打马赛克
因为项目需要用到给图片打码的功能,本身实现也不是很复杂,就没有借鉴其他类库,参照网上的一些资料实现了一个简单的给图片局部打码的功能。也可以给一个图片的多个局部进行打码。
ImageArea.java
package com.test;/*** 图片区域类* @author hty**/
public class ImageArea {int x; //指定区域左上角横坐标int y; //指定区域左上角纵坐标int width; //指定区域宽度int height; //指定区域高度public ImageArea(int x, int y, int width, int height) {super();this.x = x;this.y = y;this.width = width;this.height = height;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + height;result = prime * result + width;result = prime * result + x;result = prime * result + y;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;ImageArea other = (ImageArea) obj;if (height != other.height)return false;if (width != other.width)return false;if (x != other.x)return false;if (y != other.y)return false;return true;}}
ImageUtil.java
package com.test;import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;import javax.imageio.ImageIO;/*** 图片处理类* @author hty**/
public class ImageUtil {/*** 给图片指定位置打马赛克* @param filePath 图片位置* @param targetPath 打码后的图片保存位置,若为空则保存路径默认为原图片路径* @param x 图片要打码区域左上角的横坐标* @param y 图片要打码区域左上角的纵坐标* @param width 图片要打码区域的宽度* @param height 图片要打码区域的高度* @param mosaicSize 马赛克尺寸,即每个矩形的长宽* @return* @throws IOException */@SuppressWarnings("static-access")public static boolean mosaic(String filePath, String targetPath, int x, int y, int width, int height, int mosaicSize) throws IOException {//1. 初始化图像处理各变量if (!filePath.endsWith(".png") && !filePath.endsWith(".jpg") &&!filePath.endsWith(".gif")) {System.err.println("ImageUtil>>>文件名非法,不是正确的图片文件名");return false;}int index = filePath.lastIndexOf(".");String suffix = filePath.substring(index + 1);if (targetPath != null && !targetPath.isBlank() && !targetPath.endsWith(suffix)) {System.err.println("ImageUtil>>>目标文件后缀应与源文件后缀一致");return false;}File file = new File(filePath);if (!file.isFile()) {System.err.println("ImageUtil>>>" + filePath + "不是一个文件!");return false;}BufferedImage bi = ImageIO.read(file); // 读取该图片BufferedImage spinImage = new BufferedImage(bi.getWidth(),bi.getHeight(), bi.TYPE_INT_RGB);if (bi.getWidth() < mosaicSize || bi.getHeight() < mosaicSize || mosaicSize <= 0) { // 马赛克格尺寸太大或太小System.err.println("马赛克尺寸设置不正确");return false;}//2. 设置各方向绘制的马赛克块个数int xcount = 0; // 方向绘制个数int ycount = 0; // y方向绘制个数if (width % mosaicSize == 0) {xcount = width / mosaicSize;} else {xcount = width / mosaicSize + 1;}if (height % mosaicSize == 0) {ycount = height / mosaicSize;} else {ycount = height / mosaicSize + 1;}//3. 绘制马赛克(绘制矩形并填充颜色)Graphics gs = spinImage.getGraphics();gs.drawImage(bi, 0, 0, null);int xTmp = x;int yTmp = y;for (int i = 0; i < xcount; i++) {for (int j = 0; j < ycount; j++) {//马赛克矩形格大小int mwidth = mosaicSize;int mheight = mosaicSize;if(i == xcount - 1){ //横向最后一个比较特殊,可能不够一个sizemwidth = width - xTmp;}if(j == ycount - 1){ //同理mheight = height - yTmp;}//矩形颜色取中心像素点RGB值int centerX = xTmp;int centerY = yTmp;if (mwidth % 2 == 0) {centerX += mwidth / 2;} else {centerX += (mwidth - 1) / 2;}if (mheight % 2 == 0) {centerY += mheight / 2;} else {centerY += (mheight - 1) / 2;}Color color = new Color(bi.getRGB(centerX, centerY));gs.setColor(color);gs.fillRect(xTmp, yTmp, mwidth, mheight);yTmp = yTmp + mosaicSize;// 计算下一个矩形的y坐标}yTmp = y;// 还原y坐标xTmp = xTmp + mosaicSize;// 计算x坐标}gs.dispose();if (targetPath == null || targetPath.isBlank())targetPath = filePath;File sf = new File(targetPath);ImageIO.write(spinImage, suffix, sf); // 保存图片return true;}public static boolean mosaic(String filePath, String targetPath,ImageArea area, int mosaicSize) throws IOException {return mosaic(filePath, targetPath, area.getX(), area.getY(),area.getWidth(), area.getHeight(), mosaicSize);}/*** 给图片多个指定位置打马赛克* @param filePath 图片位置* @param targetPath 打码后的图片保存位置,若为空则保存路径默认为原图片路径* @param areaList 图片区域对象数组* @param mosaicSize 马赛克尺寸,即每个矩形的长宽* @return* @throws IOException*/@SuppressWarnings("static-access")public static boolean mosaic(String filePath, String targetPath,List<ImageArea> areaList, int mosaicSize) throws IOException {//1. 初始化图像处理各变量if (!filePath.endsWith(".png") && !filePath.endsWith(".jpg") &&!filePath.endsWith(".gif")) {System.err.println("ImageUtil>>>文件名非法,不是正确的图片文件名");return false;}int index = filePath.lastIndexOf(".");String suffix = filePath.substring(index + 1);if (targetPath != null && !targetPath.isBlank() && !targetPath.endsWith(suffix)) {System.err.println("ImageUtil>>>目标文件后缀应与源文件后缀一致");return false;}File file = new File(filePath);if (!file.isFile()) {System.err.println("ImageUtil>>>" + filePath + "不是一个文件!");return false;}BufferedImage bi = ImageIO.read(file); // 读取该图片BufferedImage spinImage = new BufferedImage(bi.getWidth(),bi.getHeight(), bi.TYPE_INT_RGB);if (bi.getWidth() < mosaicSize || bi.getHeight() < mosaicSize || mosaicSize <= 0) { // 马赛克格尺寸太大或太小System.err.println("马赛克尺寸设置不正确");return false;}Graphics gs = spinImage.getGraphics();gs.drawImage(bi, 0, 0, null);//对每一个局部区域分别绘制马赛克for (ImageArea imageArea : areaList) {int x = imageArea.getX();int y = imageArea.getY();int width = imageArea.getWidth();int height = imageArea.getHeight();//2. 设置各方向绘制的马赛克块个数int xcount = 0; // 方向绘制个数int ycount = 0; // y方向绘制个数if (width % mosaicSize == 0) {xcount = width / mosaicSize;} else {xcount = width / mosaicSize + 1;}if (height % mosaicSize == 0) {ycount = height / mosaicSize;} else {ycount = height / mosaicSize + 1;}//3. 绘制马赛克(绘制矩形并填充颜色)int xTmp = x;int yTmp = y;for (int i = 0; i < xcount; i++) {for (int j = 0; j < ycount; j++) {//马赛克矩形格大小int mwidth = mosaicSize;int mheight = mosaicSize;if(i == xcount - 1){ //横向最后一个比较特殊,可能不够一个sizemwidth = width - xTmp;}if(j == ycount - 1){ //同理mheight = height - yTmp;}//矩形颜色取中心像素点RGB值int centerX = xTmp;int centerY = yTmp;if (mwidth % 2 == 0) {centerX += mwidth / 2;} else {centerX += (mwidth - 1) / 2;}if (mheight % 2 == 0) {centerY += mheight / 2;} else {centerY += (mheight - 1) / 2;}Color color = new Color(bi.getRGB(centerX, centerY));gs.setColor(color);gs.fillRect(xTmp, yTmp, mwidth, mheight);yTmp = yTmp + mosaicSize;// 计算下一个矩形的y坐标}yTmp = y;// 还原y坐标xTmp = xTmp + mosaicSize;// 计算x坐标}}gs.dispose();if (targetPath == null || targetPath.isBlank())targetPath = filePath;File sf = new File(targetPath);ImageIO.write(spinImage, suffix, sf); // 保存图片return true;}
}
Main.java
package com.test;import java.io.IOException;public class Main {public static void main(String[] args) {try {ImageUtil.mosaic("C:\\Users\\Lenovo\\Pictures\\测试.jpg","C:\\Users\\Lenovo\\Pictures\\sb.jpg", new ImageArea(300, 100, 700, 600), 40);} catch (IOException e) {System.err.println("出错了!!!!");e.printStackTrace();}}}
运行效果:
打码前:
打码后:
Java实现给图片局部打马赛克相关推荐
- Java实现给图片局部打马赛克(前提是知道坐标的情况下)
直接上代码 package com.test;/*** 图片区域类* @author hty**/ public class ImageArea {int x; //指定区域左上角横坐标int y; ...
- 马赛克 php,php实现图片局部打马赛克的方法
本文实例讲述了php实现图片局部打马赛克的方法.分享给大家供大家参考.具体分析如下: 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. ...
- 马赛克 php,php实现图片局部打马赛克的方法_php技巧
本文实例讲述了php实现图片局部打马赛克的方法.分享给大家供大家参考.具体分析如下: 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. ...
- php 图片局部打马赛克
php 图片局部打马赛克 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. 本例使用GD库的imagecolorat获取像素颜色,使用 ...
- Java如何去除图片上的马赛克
Java中可以使用图像处理的库,如Java OpenCV或Java ImageJ来去除图片上的马赛克. 具体步骤如下: 使用OpenCV或ImageJ库加载图像. 使用图像处理算法进行降噪处理,以去除 ...
- JAVA生成图片缩略图、JAVA截取图片局部内容
目前,google已经有了更好的处理JAVA图片的工具,请搜索:Thumbnailator package com.ares.image.test;import java.awt.Color; imp ...
- matlab检测图片马赛克,python 检测图片是否有马赛克
原理讲的很清晰,给原博主一个赞 边缘检测之后按照正方形检索来判定是否是马赛克内容 原理知晓了之后就很好做了 话说MATLAB转化为python的过程还是很有趣的 from PIL import Ima ...
- python图片马赛克_python 检测图片是否有马赛克
原理讲的很清晰,给原博主一个赞 边缘检测之后按照正方形检索来判定是否是马赛克内容 原理知晓了之后就很好做了 话说MATLAB转化为python的过程还是很有趣的 from PIL import Ima ...
- java批量转换图片格式
废话不多直接上代码,代码其实也不多.... package com.qiao.testImage;import java.awt.image.BufferedImage; import java.io ...
最新文章
- linux磁盘同步函数,Linux系统调用fsync函数详解
- boost::logic::tribool相关用法的测试程序
- c语言判定三角形方法,c语言判定三角形的各种类型——请大家指点
- C# 反射机制(转)
- R统计绘图 - 热图美化
- java的消息机制协议_消息推送机制技术设计
- 拓端tecdat|用R语言模拟M / M / 1随机服务排队系统
- 2012最热门软件游戏下载Top搜集(热门影音,游戏,办公软件大集合)
- Android使用TextToSpeech(TTS)实现文字转语音合成播放
- 启用计算机共享,电脑无法启用共享访问怎么办
- 【图文并茂】六十多个 vscode 插件,助你打造最强编辑器
- 对金融基础知识的小总结
- 全网最详细SUMO仿真软件教程——入门篇
- 手把手教你写一个脚手架
- offictab,word ,excel多窗口插件
- Vue.js实战之系统学习第七节
- 工作报告思维导图模板及绘制方法分享
- Windows 命令行添加用户
- 使用Unity3D制作真实地形的两种方法
- 红米k40和红米k30s哪个好 哪个更值得入手
热门文章
- 在CentOS7上安装Drone搭建CI持续集成环境
- 计算机考研1000题pdf,2020考研张宇1000题(数一、二、三全).pdf
- 噪声dba是什么单位_声音的大小dB,到底是什么单位?
- 开源软件新时代:55个经典开源Windows工具
- JavaScript(WebAPI)
- windows达梦数据库卸载不完全,重新装达梦数据库现有服务失败/该实例名已被其他实例占用
- C++什么时候用new,什么时候不用new
- webrtc 的回声抵消(aec、aecm)算法简介(转)
- 六年级下册第二单元计算机,六年级下册语文第二单元作文(精选10篇)
- Manifest merger failed with multiple errors, see logs问题解决