java 给图片加马赛克_java处理图片--图片的缩放,旋转和马赛克化
下面是编程之家 jb51.cc 通过网络收集整理的代码片段。
编程之家小编现在分享给大家,也给大家做个参考。
这是我自己结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化。(转载请注明出处:
http://blog.csdn.net/u012116457)
不多说,上代码:
package deal;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
/**
* 图像处理类.
*
* @author nagsh
*
*/
public class ImageDeal {
String openUrl; // 原始图片打开路径
String saveUrl; // 新图保存路径
String saveName; // 新图名称
String suffix; // 新图类型 只支持gif,jpg,png
public ImageDeal(String openUrl,String saveUrl,String saveName,String suffix) {
this.openUrl = openUrl;
this.saveName = saveName;
this.saveUrl = saveUrl;
this.suffix = suffix;
}
/**
* 图片缩放.
*
* @param width
* 需要的宽度
* @param height
* 需要的高度
* @throws Exception
*/
public void zoom(int width,int height) throws Exception {
double sx = 0.0;
double sy = 0.0;
File file = new File(openUrl);
if (!file.isFile()) {
throw new Exception("ImageDeal>>>" + file + " 不是一个图片文件!");
}
BufferedImage bi = ImageIO.read(file); // 读取该图片
// 计算x轴y轴缩放比例--如需等比例缩放,在调用之前确保参数width和height是等比例变化的
sx = (double) width / bi.getWidth();
sy = (double) height / bi.getHeight();
AffineTransformOp op = new AffineTransformOp(
AffineTransform.getScaleInstance(sx,sy),null);
File sf = new File(saveUrl,saveName + "." + suffix);
Image zoomImage = op.filter(bi,null);
try {
ImageIO.write((BufferedImage) zoomImage,suffix,sf); // 保存图片
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 旋转
*
* @param degree
* 旋转角度
* @throws Exception
*/
public void spin(int degree) throws Exception {
int swidth = 0; // 旋转后的宽度
int sheight = 0; // 旋转后的高度
int x; // 原点横坐标
int y; // 原点纵坐标
File file = new File(openUrl);
if (!file.isFile()) {
throw new Exception("ImageDeal>>>" + file + " 不是一个图片文件!");
}
BufferedImage bi = ImageIO.read(file); // 读取该图片
// 处理角度--确定旋转弧度
degree = degree % 360;
if (degree < 0)
degree = 360 + degree;// 将角度转换到0-360度之间
double theta = Math.toRadians(degree);// 将角度转为弧度
// 确定旋转后的宽和高
if (degree == 180 || degree == 0 || degree == 360) {
swidth = bi.getWidth();
sheight = bi.getHeight();
} else if (degree == 90 || degree == 270) {
sheight = bi.getWidth();
swidth = bi.getHeight();
} else {
swidth = (int) (Math.sqrt(bi.getWidth() * bi.getWidth()
+ bi.getHeight() * bi.getHeight()));
sheight = (int) (Math.sqrt(bi.getWidth() * bi.getWidth()
+ bi.getHeight() * bi.getHeight()));
}
x = (swidth / 2) - (bi.getWidth() / 2);// 确定原点坐标
y = (sheight / 2) - (bi.getHeight() / 2);
BufferedImage spinImage = new BufferedImage(swidth,sheight,bi.getType());
// 设置图片背景颜色
Graphics2D gs = (Graphics2D) spinImage.getGraphics();
gs.setColor(Color.white);
gs.fillRect(0,swidth,sheight);// 以给定颜色绘制旋转后图片的背景
AffineTransform at = new AffineTransform();
at.rotate(theta,swidth / 2,sheight / 2);// 旋转图象
at.translate(x,y);
AffineTransformOp op = new AffineTransformOp(at,AffineTransformOp.TYPE_BICUBIC);
spinImage = op.filter(bi,spinImage);
File sf = new File(saveUrl,saveName + "." + suffix);
ImageIO.write(spinImage,sf); // 保存图片
}
/**
* 马赛克化.
* @param size 马赛克尺寸,即每个矩形的长宽
* @return
* @throws Exception
*/
public boolean mosaic(int size) throws Exception {
File file = new File(openUrl);
if (!file.isFile()) {
throw new Exception("ImageDeal>>>" + file + " 不是一个图片文件!");
}
BufferedImage bi = ImageIO.read(file); // 读取该图片
BufferedImage spinImage = new BufferedImage(bi.getWidth(),bi.getHeight(),bi.TYPE_INT_RGB);
if (bi.getWidth() < size || bi.getHeight() < size || size <= 0) { // 马赛克格尺寸太大或太小
return false;
}
int xcount = 0; // 方向绘制个数
int ycount = 0; // y方向绘制个数
if (bi.getWidth() % size == 0) {
xcount = bi.getWidth() / size;
} else {
xcount = bi.getWidth() / size + 1;
}
if (bi.getHeight() % size == 0) {
ycount = bi.getHeight() / size;
} else {
ycount = bi.getHeight() / size + 1;
}
int x = 0; //坐标
int y = 0;
// 绘制马赛克(绘制矩形并填充颜色)
Graphics gs = spinImage.getGraphics();
for (int i = 0; i < xcount; i++) {
for (int j = 0; j < ycount; j++) {
//马赛克矩形格大小
int mwidth = size;
int mheight = size;
if(i==xcount-1){ //横向最后一个比较特殊,可能不够一个size
mwidth = bi.getWidth()-x;
}
if(j == ycount-1){ //同理
mheight =bi.getHeight()-y;
}
// 矩形颜色取中心像素点RGB值
int centerX = x;
int centerY = y;
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(x,y,mwidth,mheight);
y = y + size;// 计算下一个矩形的y坐标
}
y = 0;// 还原y坐标
x = x + size;// 计算x坐标
}
gs.dispose();
File sf = new File(saveUrl,sf); // 保存图片
return true;
}
public static void main(String[] args) throws Exception {
ImageDeal imageDeal = new ImageDeal("e://1.jpg","e://","2","jpg");
// 测试缩放
/* imageDeal.zoom(200,300); */
// 测试旋转
/* imageDeal.spin(90); */
//测试马赛克
/*imageDeal.mosaic(4);*/
}
}
以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
java 给图片加马赛克_java处理图片--图片的缩放,旋转和马赛克化相关推荐
- java给图片加水印_Java 为图片添加水印(图片水印,文字水印)
Java 为图片添加水印(图片水印,文字水印) 2014-07-28·WeaponX 5267 次浏览 ```java import java.awt.Color; import java.awt.F ...
- JAVA实现图片加水印及Base64图片字符串加水印
JAVA实现图片加水印及Base64图片字符串加水印 可将根据不同需求选择场景一,场景二来实现家水印操作,个人感觉比我上一遍文章<base64字符串加水印 >实在 场景一: 涉及上送过来的 ...
- 火车头dede采集接口,图片加水印,远程图片本地化,远程无后缀的无图片本地化...
<?php /*[LocoySpider] (C)2005-2010 Lewell Inc.火车采集器 DedeCMS 5.7 UTF8 文章发布接口 Update content: 图片加水印 ...
- img标签图片加载失败显示图片
img标签图片加载失败显示图片 onerror="οnerrοr=null;src='../../image/community/initialize_img.png'"
- java马赛克_java实现图片缩放、旋转和马赛克化
本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化. 不多说,上代码: package deal; import java.awt.Color; import jav ...
- java图片马赛克_java实现图片缩放、旋转和马赛克化
本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化. 不多说,上代码: package deal; import java.awt.Color; import jav ...
- java图片转字符_java实现图片转字符图(看的过去的亚子)
普通图片转换为ASSIC码灰度图片 原图: 效果图: 转换方法 读取图片文件到BufferedImage 读取BufferedImage中的RGB值 将RGB三色值按照(0.3,0.59,0.11)权 ...
- java图片加气泡文字,动态图片加气泡文字 微信动态图片加文字教程
现在微信聊天少不了表情图片,这越有个性.独特的就越受大众喜爱,每每看到好看的图片时,大家也会忍不住收藏起来用.那你有没有想过自己P图呢?学一下PS图片创作一些独一无二的搞笑表情图,放在微信上秀秀吧,也 ...
- java图片加气泡文字_图片加气泡文字
现在微信聊天少不了表情图片,这越有个性.独特的就越受大众喜爱,每每看到好看的图片时,大家也会忍不住收藏起来用.那你有没有想过自己P图呢?学一下PS图片创作一些独一无二的搞笑表情图,放在微信上秀秀吧,也 ...
最新文章
- halcon与QT联合:(5.2)瓶盖检测以及QT界面搭建
- 如何在SAP云平台上使用MongoDB服务
- ESI世界大学排名:371所内地高校上榜!
- struts2中struts.xml和web.xml文件解析及工作原理
- 【转载】Linux下有趣的命令
- SDHelper module加密系统解密
- 任务调度开源框架Quartz动态添加、修改和删除定时任务
- 操作系统之进程管理:7、进程同步、进程互斥
- python七段数码管绘制秒表_Python绘制七段数码管实例代码
- 【报告分享】见实私域流量白皮书:私域流量案例实操手册.pdf
- android-清单小文件
- 概率论与数理统计 重点篇
- 计算机考研数据结构代码题总结--Day01
- C语言lo如何优化运行界面,高质量程序优化总结整理【经典】
- 使用链表实现栈stack
- 商家们,不要得罪天猫和京东中的任何一个
- TreeView添加treeView1_NodeMouseClick----多么痛的领悟。。。
- Office Visio简介
- 苹果6如何截屏_苹果商量里需要花6元,才能买到的游戏:论如何建立一个修仙门派,到底好不好玩...
- 定点补码运算c语言,单选(3分) 下列关于补码定点运算的描述中,错误的是( )...
热门文章
- 人工智能领域有哪些优秀的工作第一次是被拒稿的,被什么拒了。现在怎么样? 拒稿理由是什么?...
- python类中函数互相调用记得带self
- opencv 图像 水平镜像翻转 函数
- mysql左连接多条件,on子句多条件
- 超详细的Linux安装及配置【fastDFS+nginx】处理海量图片传输与存储【报错解决】
- lodash.js - 根据不同字段筛选出的数组 转 对象 转 数组
- 网络科学导论 - network Science:an introduction 汪小帆版本
- 2022-1-23 牛客C++ 项目 —— signal 函数
- layui弹出层弹出另一个页面
- IDEA中如何查看现有分支是基于哪个分支创建的?