因为项目需要用到给图片打码的功能,本身实现也不是很复杂,就没有借鉴其他类库,参照网上的一些资料实现了一个简单的给图片局部打码的功能。也可以给一个图片的多个局部进行打码。

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实现给图片局部打马赛克相关推荐

  1. Java实现给图片局部打马赛克(前提是知道坐标的情况下)

    直接上代码 package com.test;/*** 图片区域类* @author hty**/ public class ImageArea {int x; //指定区域左上角横坐标int y; ...

  2. 马赛克 php,php实现图片局部打马赛克的方法

    本文实例讲述了php实现图片局部打马赛克的方法.分享给大家供大家参考.具体分析如下: 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. ...

  3. 马赛克 php,php实现图片局部打马赛克的方法_php技巧

    本文实例讲述了php实现图片局部打马赛克的方法.分享给大家供大家参考.具体分析如下: 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. ...

  4. php 图片局部打马赛克

    php 图片局部打马赛克 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. 本例使用GD库的imagecolorat获取像素颜色,使用 ...

  5. Java如何去除图片上的马赛克

    Java中可以使用图像处理的库,如Java OpenCV或Java ImageJ来去除图片上的马赛克. 具体步骤如下: 使用OpenCV或ImageJ库加载图像. 使用图像处理算法进行降噪处理,以去除 ...

  6. JAVA生成图片缩略图、JAVA截取图片局部内容

    目前,google已经有了更好的处理JAVA图片的工具,请搜索:Thumbnailator package com.ares.image.test;import java.awt.Color; imp ...

  7. matlab检测图片马赛克,python 检测图片是否有马赛克

    原理讲的很清晰,给原博主一个赞 边缘检测之后按照正方形检索来判定是否是马赛克内容 原理知晓了之后就很好做了 话说MATLAB转化为python的过程还是很有趣的 from PIL import Ima ...

  8. python图片马赛克_python 检测图片是否有马赛克

    原理讲的很清晰,给原博主一个赞 边缘检测之后按照正方形检索来判定是否是马赛克内容 原理知晓了之后就很好做了 话说MATLAB转化为python的过程还是很有趣的 from PIL import Ima ...

  9. java批量转换图片格式

    废话不多直接上代码,代码其实也不多.... package com.qiao.testImage;import java.awt.image.BufferedImage; import java.io ...

最新文章

  1. linux磁盘同步函数,Linux系统调用fsync函数详解
  2. boost::logic::tribool相关用法的测试程序
  3. c语言判定三角形方法,c语言判定三角形的各种类型——请大家指点
  4. C# 反射机制(转)
  5. R统计绘图 - 热图美化
  6. java的消息机制协议_消息推送机制技术设计
  7. 拓端tecdat|用R语言模拟M / M / 1随机服务排队系统
  8. 2012最热门软件游戏下载Top搜集(热门影音,游戏,办公软件大集合)
  9. Android使用TextToSpeech(TTS)实现文字转语音合成播放
  10. 启用计算机共享,电脑无法启用共享访问怎么办
  11. 【图文并茂】六十多个 vscode 插件,助你打造最强编辑器
  12. 对金融基础知识的小总结
  13. 全网最详细SUMO仿真软件教程——入门篇
  14. 手把手教你写一个脚手架
  15. offictab,word ,excel多窗口插件
  16. Vue.js实战之系统学习第七节
  17. 工作报告思维导图模板及绘制方法分享
  18. Windows 命令行添加用户
  19. 使用Unity3D制作真实地形的两种方法
  20. 红米k40和红米k30s哪个好 哪个更值得入手

热门文章

  1. 在CentOS7上安装Drone搭建CI持续集成环境
  2. 计算机考研1000题pdf,2020考研张宇1000题(数一、二、三全).pdf
  3. 噪声dba是什么单位_声音的大小dB,到底是什么单位?
  4. 开源软件新时代:55个经典开源Windows工具
  5. JavaScript(WebAPI)
  6. windows达梦数据库卸载不完全,重新装达梦数据库现有服务失败/该实例名已被其他实例占用
  7. C++什么时候用new,什么时候不用new
  8. webrtc 的回声抵消(aec、aecm)算法简介(转)
  9. 六年级下册第二单元计算机,六年级下册语文第二单元作文(精选10篇)
  10. Manifest merger failed with multiple errors, see logs问题解决