这是我自己结合网上的一些资料封装的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> |
相关推荐
Java实现图片缩放、旋转和马赛克化技术详解 Java语言作为一门强大的编程语言,广泛应用于图像处理领域。今天,我们将详细介绍Java实现图片缩放、旋转和马赛克化的技术。 一、图片缩放 图片缩放是图像处理中非常...
范例5-15-1 影像马赛克处理 157 范例5-16-1 影像添加外框 158 范例5-17-1合并两个影像 160 范例5-17-2合并两个影像,使用不规则形状 161 第6章 使用核矩阵进行影像处理 165 范例6-1-1 Mean filter处理 165 范例6-2-1 ...
在IT领域,图片处理是一项广泛应用于各种场景的关键技术,如图像编辑、数据分析、人工智能和视觉艺术等。在本项目中,我们关注的是使用C#语言和OpenCV库进行图片处理和美化。OpenCV是一个强大的开源计算机视觉库,它...
本压缩包文件“Java图像处理(一)基础源码.zip”提供了几个核心的图像处理功能,如马赛克效果、二值化、边缘检测、图像融合、旋转以及缩放。这些功能是通过三个主要的Java类实现的:ImageProcessUtil.java、...
PhotoEdit(适用于Android Studio) 注意:关于本地源码(C / C ++)编译成so文件。请参照: : 查看eclipse项目请取消 WiKi: : 升级版APK: : 部分快照:
图像的旋转、缩放和颜色调整可以通过修改`BufferedImage`的像素值来实现。 7. **撤销/重做**:为了实现撤销和重做功能,可以使用栈数据结构存储历史操作,每次操作后将当前状态压入栈中,撤销时弹出栈顶元素,重做...
一款图片编辑类库,功能类似微信中图片编辑功能,其主要目标用于聊天中快速编辑图片。 包含以下主要功能: 缩放 涂鸦 文字 马赛克 裁剪 旋转 Usage implementation project(':image') 参考Sample示例 Sample fun ...
一款图片编辑类库,功能类似微信中图片编辑功能,其主要目标用于聊天中快速编辑图片。 包含以下主要功能: 缩放 涂鸦 文字 马赛克 裁剪 旋转 Usage implementation project(':image') 参考Sample示例 Sample fun ...
支持5层OSD,3个视频层,最大支持2560x1600分辨率图像输出,马赛克及多区域显示,Mirror功能,16/32位色深,图形及视频旋转,LetterBox和PanScan,3D视频处理及显示,视频、图形多阶垂直和水平缩放,低延时显示技术...