这是我自己结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化。(转载请注明出处:http://blog.youkuaiyun.com/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>
|