本文是作者结合网上的一些资料封装的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马赛克_java实现图片缩放、旋转和马赛克化相关推荐

  1. java图片马赛克_java实现图片缩放、旋转和马赛克化

    本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化. 不多说,上代码: package deal; import java.awt.Color; import jav ...

  2. java 给图片加马赛克_java处理图片--图片的缩放,旋转和马赛克化

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. 这是我自己结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化.(转 ...

  3. java旋转图片并画出_java实现图片角度旋转并获得图片信息

    本文实例为大家分享了java实现图片角度旋转并获得图片信息的具体代码,供大家参考,具体内容如下 public class demo { /** * 调整图片角度 * make by dongxh 20 ...

  4. java判断身份证图片旋转角度_java实现图片角度旋转并获得图片信息

    本文实例为大家分享了java实现图片角度旋转并获得图片信息的具体代码,供大家参考,具体内容如下 public class Demo { /** * 调整图片角度 * make by dongxh 20 ...

  5. java 滤镜_Java实现图片的滤镜效果

    滤镜 滤镜:主要是用来实现图像的各种特殊效果.它在Photoshop中具有非常神奇的作用.滤镜通常需要同通道.图层等联合使用,才能取得最佳艺术效果. 在移动端或者在web开发时处理图片都是一件麻烦的事 ...

  6. Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理

    前言 java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API ...

  7. Java使用thumbnailator进行图片压缩缩放裁剪水印旋转处理

    Java使用thumbnailator进行图片压缩缩放裁剪水印旋转处理 一.thumbnailator介绍 二.使用步骤 1.maven的pom.xml引入如下 2.测试代码 一.thumbnaila ...

  8. java水印_Java实现给图片添加图片水印,文字水印及马赛克的方法示例

    本文实例讲述了Java实现给图片添加图片水印,文字水印及马赛克的方法.分享给大家供大家参考,具体如下: 可以在eclipse中新建个Utils类,把以下代码复制进去直接使用,以下方法实现单个或多个水印 ...

  9. java 文字水印 旋转_利用Thumbnailator轻松实现图片缩放、旋转与加水印

    概述 Thumbnailator 是一个开源的 Java 项目,它提供了非常简单的 API 来对图片进行缩放.旋转以及加水印的处理. 有多简单呢?简单到一行代码就可以完成图片处理.形式如下: Thum ...

最新文章

  1. socket函数介绍
  2. sit是什么环境_软件环境常识 --dev sit uat
  3. oracle如何在本地建库,oracle在本地建库
  4. hp-socket 文本跟图片同时发送_文本、截图和应用,这样「包装」一秒变美观
  5. oracle还原脚本,oracle自动恢复脚本
  6. 升级总代分享思路_定档了!升级了!1月23日《我家那闺女》第二季要给你“好看”...
  7. springMVC3学习(十)--注解式控制器
  8. C# 键盘钩子和鼠标钩子的使用详解
  9. 会玩,也是一种积极的生活态度
  10. 文件上传绕过安全狗WAF实战
  11. 记工作的第一月--光说不练,假把式
  12. 途牛原创|基于EAV模型的运营系统架构实践
  13. Java基础入门:IDEA软件安装和软件初始化设置
  14. 深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning...
  15. FlinkSQL to Kafka连接器报错:could not find any factory for identifier ‘kafka‘ that implements
  16. 洛谷题目[NOIP2016 提高组]P1563 玩具谜题 详解<每日一题>
  17. 各种计算机语言的经典书籍(C/C++/Java/C#/VC/VB等)
  18. tp5下delete()方法
  19. 通信原理及系统系列29——基于Matlab自动增益控制(AGC)算法分析1
  20. 信息学奥赛一本通 1404:我家的门牌号 | OpenJudge NOI 2.1 7649:我家的门牌号 | 小学奥数 7649

热门文章

  1. 用ECharts生成统计图
  2. 7. 常见网络攻击欺骗手段与防护
  3. 使用Markdown制作简历
  4. 学习c#的最后一天,做了一个文字版的1V1的小游戏
  5. 【谈谈NetSuite中的“预付及核销”】
  6. 语法数学一点不会?可以学编程吗QAQ
  7. 1949-2020年全国31省铁路里程数据
  8. H5实现一个简易本地视频播放器
  9. Android OpenGLES滤镜开发之仿抖音灵魂出窍
  10. Office365 Word 打开某个文件就自动卡死关闭