图片马赛克处理(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.输入输出
  • 处理前

在这里插入图片描述

  • 处理后(中心点取色)

在这里插入图片描述

  • 处理后(灰度处理)

在这里插入图片描述

  • 处理后(随机取色)

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

screen使用——关机时在服务器上跑代码

一、连接服务器 原理:通过 SSH(Secure Shell)协议建立本地与远程服务器的安全连接通道,使得可以在本地操作服务器。 操作:使用 VSCode 或 cmd 的 ssh 连接到服务器,这里我选择cmd。 检查是否安装 OpenSSH 在 Windows 10 及以上版本中,系统可能已经自带 OpenSSH 客户端…

(k8s)Kubernetes部署Promehteus

转载&#xff1a;Kubernetes&#xff08;k8s&#xff09;部署Promehteus 一、概述 在1.8版本以后heapster由metrics-server替代&#xff1b;从k8s的v1.11版本开始已经全面转向以Prometheus为核心的新监控体系架构&#xff1b;kube-prometheus 中包含了 prometheus 监控所用到的…

Kubernetes(K8S)实战:构建高可用的微服务架构

Kubernetes(K8S)实战:构建高可用的微服务架构 在云计算与容器化技术日新月异的今天,Kubernetes(简称K8S)凭借其强大的容器编排能力,已成为企业构建云原生应用的首选平台。本文将深入探讨Kubernetes的核心概念、架构设计原则,并通过一个实际案例——构建一个高可用的微…

pg入门18—如何使用pg gis

1. 下载postgre gis镜像 2. 运行镜像 docker run -p 15432:5432 -d -e POSTGRES_PASSWORDAb123456! postgis/postgis:12-3.4-alpine 3. 使用gis # 进入容器&#xff0c;登录pgdocker exec -it bash# 登录数据库psql -U postgres# 创建数据库CREATE DATABASE mygeotest;# 使用…

算法:双指针题目练习

文章目录 算法:双指针移动零复写零快乐数盛最多水的容器有效三角形的个数查找总价格为目标值的两个商品三数之和四数之和 总结 算法:双指针 移动零 定义两个指针,slow和fast.用这两个指针把整个数组分成三块. [0,slow]为非零元素,[slow1,fast-1]为0元素,[fast,num.length]为未…

数据库面试题整理

数据库面试题整理 整理了下常见的有关数据的面试题&#xff0c;持续更新中 1. mysql数据库事务的四个特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务要么做&#xff0c;要么不做一致性&#xff08;Consistency&#xff09;&#xff1a;使数据库从…

Nginx泛域名 解析的匹配前缀绑定或转发到子目录

网站的目录结构为&#xff1a; # tree /home/wwwroot/landui.com /home/wwwroot/landui.com ├── bbs │ └── index.html └── www └── index.html 2 directories, 2 files /home/wwwroot/landui.com为nginx的安装目录下默认的存放源代码的路径。 bbs为论坛…

GPU使用

0. 写这篇文章的背景 最近还是在使用GPU、连接远程服务器上出现了一点问题,发现在这方面的知识还是学得很模糊。(最让人感到困惑的是之前GPU的使用都没有问题) 总结一下最近的问题: 1.每一次连接远程服务器(选择的Ubuntu22.04),使用服务器的文件夹还好(关键是现在用…

YARN性能优化高频面试题及答案

目录 高频面试题及答案1. 什么是YARN?它在Hadoop生态系统中的作用是什么?2. 如何通过合理配置`Container`大小来优化YARN性能?3. 如何通过调整`ResourceManager`的调度策略优化YARN性能?4. 如何优化YARN中`ResourceManager`和`NodeManager`的内存配置?5. 如何通过调节`Map…

【Web】御网杯信息安全大赛2024 wp(全)

目录 input_data admin flask 如此多的FLAG 一夜醒来之全国CTF水平提升1000倍&#x1f60b; input_data 访问./.svn后随便翻一翻拿到flag admin dirsearch扫出来 访问./error看出来是java框架 测出来是/admin;/路由打Spring View Manipulation(Java)的SSTI https:/…

基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真&#xff0c;对比网络通信开销&#xff0c;存活节点数量&#xff0c;网络能耗以及数据通信量四个指标…

Unity射击游戏开发教程:(36)敌人关卡生成器的设计和开发

丰富多样地游戏关卡生成器能自动生成不同的关卡地图和游戏内容,以增加游戏的可玩性和挑战性。关卡生成可以基于随机算法或者预设的规则生成不同的地图布局、敌人位置、道具位置等。 定义关卡生成器WaveSpawner 如何设置通用的 Wave Spawner?我将此 Wave Spawner 脚本附加到…

QT 中中文乱码的问题处理

在使用 QT 开发应用程序时&#xff0c;可能会遇到中文乱码的问题&#xff0c;这是因为 QT 使用的编码方式和系统的编码方式不一致导致的。下面是 QT 中中文乱码的问题处理的方法&#xff1a; 设置编码方式 第一步&#xff1a;在 QT 中&#xff0c;可以使用 QTextCodec 对象来设…

【Linux篇】TCP/IP协议(笔记)

目录 一、TCP/IP协议族体系结构 1. 数据链路层 &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;常用协议 ① ARP协议&#xff08;Address Resolve Protocol&#xff0c;地址解析协议&#xff09; ② RARP协议&#xff08;Reverse Address Resolve Protocol&…

js进阶——this和对象原型

1. this 在 JavaScript 中的应用 在 JavaScript 中&#xff0c;this 的值取决于函数的执行上下文和调用方式。以下是 this 在不同上下文中的行为解释&#xff1a; A. 全局上下文&#xff08;非严格模式&#xff09; 在全局执行上下文中&#xff0c;this 指向全局对象&#x…

华为为什么要做三折叠屏手机?

前些天我做了一条视频&#xff0c;关于讲华W的新的三折叠屏手机。我说我有点失望&#xff0c;结果引起了华W的同事的一些关注。于是&#xff0c;华W几位高管都跑过来&#xff0c;跟我解释为什么会出现这样的一个状态。 我才知道&#xff0c;这款手机他们其实是亏着钱在卖的。因…

C++速通LeetCode中等第1题-字母异位词分组

思路要点&#xff1a;对字符串排序&#xff0c;排序结果存放在map的key中&#xff0c;排序结果相同的字符串存放到map的value中 。 class Solution { public:string keys;vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vecto…

EECS498 Deep Learning for Computer Vision (一)软件使用指南

#最近开始学习深度学习的相关基础知识&#xff0c;记录一下相关笔记及学习成果# learning&#xff1a;building artificial systems that learn from data and experience deep learning(a set of machine learning): hierarchical learning algorithms with many "laye…

海洋大地测量基准与水下导航系列之二国外海底大地测量基准和海底观测网络发展现状(上)

海底大地控制网建设构想最先由美国斯克里普斯海洋研究所(Scripps Institution of Oceanography,SIO)提出&#xff0c;目前仅有少数发达国家具备相应技术条件。美国、日本、俄罗斯和欧盟等发达国家通过布测先进的海底大地控制网&#xff0c;不断完善海洋大地测量基准基础设施&am…

6、等级保护政策内容

数据来源&#xff1a;6.等级保护政策内容_哔哩哔哩_bilibili 信息安全产品管理与响应 等级管理 对信息系统中使用的信息安全产品实行按等级管理&#xff0c;信息安全事件应分等级响应与处置。 预测评服务由测评公司和咨询公司提供预测评服务&#xff0c;根据技术要求和测评要…