这是我自己结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化。(转载请注明出处:http://blog.csdn.net/u012116457)
不多说,上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
|
<code class = "hljs 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.zoom(200, 300); */
// 测试旋转
/* imageDeal.spin(90); */
//测试马赛克
/*imageDeal.mosaic(4);*/
}
} </code> |
相关推荐
Android图片裁剪----移动、缩放图片进行裁剪
主要为大家详细介绍了java实现图片缩放、旋转和马赛克化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
java 处理图片大小等比例缩放;图片裁剪;支持图片压缩不失真;支持图片添加水印;支持动态图的处理;支持自定义图片大小的转换 等 压缩包中内附使用说明
android手势处理图片平移、缩放和旋转 图片出界判断 处理后新图片的创建
java图片缩放 java缩略图 缩略图 java图片处理
资源文章介绍地址:https://www.cnblogs.com/lifexy/p/14762697.html ,Qt版本尽量Qt5.12及以上,支持多个图片浏览、缩放、旋转、滑轮切换图片
java处理的图片,缩放,比例处理,压缩等java处理的图片,缩放,比例处理,压缩等
matlab开发-图像格式旋转和缩放功能。这个函数获取一个图像,缩放它,并以θ(弧度,刚性运动)旋转它。
图片缩放旋转 图片缩放 图片旋转 完整程序 源代码 cb c++
java 图片缩放处理 ,图片压缩后失真很小.可自定义压缩后图片的质量
基于viewer.js实现的react图片预览组件,支持的旋转,缩放和缩放等操作
一个Android图片缩放查看控件,支持手势
环境:vs2005 opengl地球-可旋转鼠标移动按键缩放
Web_使用pinchzoom插件实现图片手势缩放. 效果描述: 一个基于jQuery的插件——Pinchzoom.js 可以实现移动网页中的图片放大或者缩小,用手指控制即可 当然,其中的jQuery完全可以换成zepto.js
网上流传的Java处理图片的代码,虽然可对图片进行简单处理,但效果并不理想。 为了解决这个问题,我也是在网上找了好久,看了很多资料,功夫不负有心人...支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。
图像编辑器演示版用法使用画布缩放,旋转,裁剪和处理图像执行加载脚本[removed][removed]实例化var imageEditorInstance = new ImageEditor({ elt: (DOM Element), ... optional settings ...});选项(对象)埃尔特...
可以实现: 1.图片缩小,采用平均值算法,可以实现长宽比不等的缩小 2.图片放大,采用线性插值,可以实现图片比例改变 3.图片旋转
用ImageMagick java实现图片的缩放
高清缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等 功能非常强大,并且很清晰,请给好评:)
图像处理算法,包括图像的缩放,滤波,增强,锐化,旋转,反色等。c语言处理算法