博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java处理图片--图片的缩放,旋转和马赛克化
阅读量:5937 次
发布时间:2019-06-19

本文共 6384 字,大约阅读时间需要 21 分钟。

这是我自己结合网上的一些资料封装的java图片处理类。支持图片的缩放,旋转,马赛克化。

(转载请注明出处:)

不多说,上代码:

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程序员笑不死的经历ส้้้้้้้้้
查看>>
php-fpm配置
查看>>
c++头文件和#include 学习笔记
查看>>
第四天(考试)
查看>>
关于VUE的路由地址问题
查看>>
node-buffer解读
查看>>
Vue 2.x折腾记 - (22) Vue 打包图片在safari不显示的问题
查看>>
ES6中的class
查看>>
iOS - swift项目接入bugly - 报错, 配置符号表,下载Java环境,
查看>>
oracle sql语句实现累加、累减、累乘、累除
查看>>
SCNetworkReachabilityRef监测网络状态
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
接口由40秒到200ms优化记录
查看>>
java 视频播放 多人及时弹幕技术 代码生成器 websocket springmvc mybatis SSM
查看>>
Activiti6.0,spring5,SSM,工作流引擎,OA
查看>>
第十三章:SpringCloud Config Client的配置
查看>>
使用 GPUImage 实现一个简单相机
查看>>
CoinWhiteBook:区块链在慈善事业中的应用
查看>>
【二】express
查看>>
Mac上基于Github搭建Hexo博客
查看>>