java处理图片--图片的缩放,旋转和马赛克化
这是我自己结合网上的一些资料封装的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, 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, suffix, 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, saveName + "." + suffix);
ImageIO.write(spinImage, suffix, 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);*/
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
java处理图片--图片的缩放,旋转和马赛克化的更多相关文章
- java基础---->Java中图片的缩放
缩略图代表网页上或计算机中图片经压缩方式处理后的小图 ,其中通常会包含指向完整大小的图片的超链接.缩略图用于在 Web 浏览器中更加迅速地装入图形或图片较多的网页.今天,我们就开始java中图像的缩略 ...
- java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。
java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...
- Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理
前言 java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API ...
- Android 图片的缩放与旋转
本文实现Android中的图片的缩放效果 首先设计布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...
- Android动画及图片的缩放和旋转
Android动画有2种,一种是Tween Animation,另一种是Frame Animation,先说说Tween动画吧. Tween动画是对视图对象中的内容进行一系列简单的转换,比如位置的移动 ...
- js手写图片查看器(图片的缩放、旋转、拖拽)
在做一次代码编辑任务中,要查看图片器.在时间允许的条件下,放弃了已经封装好的图片jq插件,现在自己手写js实现图片的缩放.旋转.推拽功能! 具体代码如下: <!DOCTYPE html> ...
- 【转】java缩放图片、java裁剪图片代码工具类
一首先看下效果 二工具类 三测试类 在系统的上传图片功能中,我们无法控制用户上传图片的大小,用户可能会上传大到几十M小到1k的的图片,一方面图片太大占据了太多的空间,另一方面,我们没办法在页面上显示统 ...
- js实现图片查看器(图片的缩放、旋转、拖拽)
一.关于图片查看器. 目前网络上能找到的图片查看器很多,谁便一搜就能出来.如:jquery.iviewer.js.Viewer.js这两个js文件,其中功能也足够满足大部分开发需求.但是单纯的就想实现 ...
- 图片在 canvas 中的 选中/平移/缩放/旋转,包含了所有canvas的2D变化,让你认识到数学的重要性
1.介绍 canvas 已经出来好久了,相信大家多少都有接触. 如果你是前端页面开发/移动开发,那么你肯定会有做过图片上传处理,图片优化,以及图片合成,这些都是可以用 canvas 实现的. 如果你是 ...
随机推荐
- How tomcat works 读书笔记十五 Digester库 下
在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的co ...
- Linux Framebuffer驱动剖析之一—软件需求
嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT两方面的原创技术分享,稍后会发布嵌入式企鹅圈的2 ...
- 机器学习算法与Python实践之(五)k均值聚类(k-means)
机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学 ...
- asp.net session分布式共享解决方案
Session共享是分布式系统设计时必须考虑的一个重要的点.相比较java中的session共享解决方案,.net中的解决方案还是比较少,MemcachedSessionProvider类库是比较优秀 ...
- ios中block访问外部变量的一些注意点
Block类型是一个C级别的语法和运行机制.它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆.栈内存绑定的变量.因此,Block对象包含着一组状态数据,这些数据在程序执行时用 ...
- 14 Live CDs for Penetration Testing (Pen Test) and Forensic
http://www.ivizsecurity.com/blog/penetration-testing/live-cd-penetration-testing-pen/ Yesterday I wa ...
- ZAB协议(Zookeeper atomic Broadcast)
一.简语: ZAB协议是Paxos算法的经典实现 二.ZAB协议的两种模式: 崩溃恢复: 1.每个server都有一张选票(myid,zxid),选票投给自己 2.收集所有server的投票 3.比较 ...
- Kotlin实践记录
Kotlin中网络请求和Json解析: Request(url).run()为Kotlin中的网络请求方式,Json解析是自己封装类的操作. Json.get().toObject(Request(u ...
- 微软黑科技强力注入,.NET C#全面支持人工智能
微软黑科技强力注入,.NET C#全面支持人工智能,AI编程领域开始C#.Py--百花齐放 就像武侠小说中,一个普通人突然得到绝世高手的几十年内力注入,招式还没学,一身内力有点方 Introducin ...
- DDGScreenShot —图片加各种滤镜高逼格操作
写在前面 图片加各种滤镜操作,当然苹果给开发者提供了相关的api和封装, 大部分开发者感觉这是这是晦涩难懂的,接下来就让我们来了解一下, 其实也没有那么深不可测. 代码如下(每一步已经解释的很详细) ...