1 package util;
2
3 import java.awt.Component;
4 import java.awt.Image;
5 import java.awt.MediaTracker;
6 import java.awt.image.CropImageFilter;
7 import java.awt.image.FilteredImageSource;
8 import java.awt.image.ImageFilter;
9 import java.awt.image.ImageProducer;
10
11 /**
12 * 图像操作辅助类
13 *
14 * @author hellokitty燕
15 *
16 */
17 public class ImageUtils {
18
19 private ImageUtils() {
20 }
21
22 /**
23 * 使用媒体追踪器加载单张图像
24 *
25 * @param mediaTracker
26 * 媒体追踪器
27 * @param image
28 * 待加载图像
29 * @return 加载完毕的图像
30 */
31 public static Image addImage(MediaTracker mediaTracker, Image image) {
32 // 将图片放置到媒体追踪器的图片列表中,准备开始加载工作
33 mediaTracker.addImage(image, 0);
34 try {
35 // 加载所有图片
36 mediaTracker.waitForAll();
37 } catch (InterruptedException e) {
38 System.err.println(e.getMessage());
39 }
40 // 官方提供的标准处理代码
41 // & -- 按位与运算
42 // 如满足条件表达式,则说明图像加载出错
43 // statusAll(false) -- 返回媒体跟踪器跟踪的所有媒体状态,如图像未加载,也不会进行加载
44 if ((mediaTracker.statusAll(false) & MediaTracker.ERRORED) != 0) {
45 System.err.println("图片加载出错...");
46 }
47 return image;
48 }
49
50 /**
51 * 使用媒体追踪器加载多张图像(一维数组)
52 *
53 * @param mediaTracker
54 * 媒体追踪器
55 * @param images
56 * 待加载的一维数组中的图像
57 * @return 加载完毕的图像
58 */
59 public static Image[] addImage(MediaTracker mediaTracker, Image[] images) {
60 for (int i = 0; i < images.length; i++) {
61 mediaTracker.addImage(images[i], i);
62 }
63 try {
64 mediaTracker.waitForAll();
65 } catch (InterruptedException e) {
66 e.printStackTrace();
67 }
68 // 官方提供的标准处理代码
69 // & -- 按位与运算
70 // 如满足条件表达式,则说明图像加载出错
71 // statusAll(false) -- 返回媒体跟踪器跟踪的所有媒体状态,如图像未加载,也不会进行加载
72 if ((mediaTracker.statusAll(false) & MediaTracker.ERRORED) != 0) {
73 System.err.println("图片加载出错...");
74 }
75 return images;
76 }
77
78 /**
79 * 使用媒体追踪器加载多张图像(二维数组)
80 *
81 * @param mediaTracker
82 * 媒体追踪器
83 * @param images
84 * 待加载的二维数组中的图像
85 * @return 加载完毕的图像
86 */
87 public static Image[][] addImage(MediaTracker mediaTracker, Image[][] images) {
88 for (int i = 0; i < images.length; i++) {
89 for (int j = 0; j < images[i].length; j++) {
90 mediaTracker.addImage(images[i][j], i);
91 }
92 }
93 try {
94 mediaTracker.waitForAll();
95 } catch (InterruptedException e) {
96 e.printStackTrace();
97 }
98 // 官方提供的标准处理代码
99 // & -- 按位与运算
100 // 如满足条件表达式,则说明图像加载出错
101 // statusAll(false) -- 返回媒体跟踪器跟踪的所有媒体状态,如图像未加载,也不会进行加载
102 if ((mediaTracker.statusAll(false) & MediaTracker.ERRORED) != 0) {
103 System.err.println("图片加载出错...");
104 }
105 return images;
106 }
107
108 /**
109 * 将传入的图片进行裁剪,裁剪后生成图像放入一维数组中保存,再进行图像加载。 通常用于裁剪所有图像在一行中的源图像
110 *
111 * @param img
112 * 待裁剪图像
113 * @param count
114 * 裁剪后的图像数量
115 * @param x
116 * 开始裁剪x坐标
117 * @param y
118 * 开始裁剪y坐标
119 * @param width
120 * 每次裁剪图像宽度
121 * @param height
122 * 每次裁剪图像高度
123 * @param changeX
124 * 每次裁剪需要改变的x坐标值
125 * @param mediaTracker
126 * 媒体追踪器
127 * @param component
128 * 用来创建裁剪后的每个图片对象的组件
129 * @return 裁剪完并加载到内存后的一维图片数组
130 */
131 public static Image[] cutAndAddImage(Image img, int count, int x, int y,
132 int width, int height, int changeX, MediaTracker mediaTracker,
133 Component component) {
134 // 创建保存裁剪后图像的一维数组
135 Image[] images = new Image[count];
136 /* 循环裁剪图像 */
137 ImageProducer producer = img.getSource(); // 获取图像源
138 for (int i = 0; i < count; i++) {
139 // 创建用于裁剪的图像过滤器
140 ImageFilter cropImageFilter = new CropImageFilter(x + i * changeX,
141 y, width, height);
142 // 裁剪源图像,将裁剪后的图像放入数组保存
143 images[i] = component.createImage(new FilteredImageSource(producer,
144 cropImageFilter));
145 }
146
147 // 调用 使用媒体追踪器加载多张图像(一维数组) 的方法完成图像加载
148 return addImage(mediaTracker, images);
149 }
150
151 /**
152 * 将传入的图片进行裁剪,裁剪后生成图像放入二维数组中保存,再进行图像加载 通常用于裁剪所有图像在多行多列中的源图像
153 *
154 * @param img
155 * 待裁剪图像
156 * @param rows
157 * 裁剪后的图像行数,即垂直方向上需要裁剪出的图片数量
158 * @param columns
159 * 裁剪后的图像列数,即水平方向上需要裁剪出的图片数量
160 * @param x
161 * 开始裁剪x坐标
162 * @param y
163 * 开始裁剪y坐标
164 * @param width
165 * 每次裁剪图像宽度
166 * @param height
167 * 每次裁剪图像高度
168 * @param changeX
169 * 每次裁剪需要改变的x坐标值
170 * @param changeY
171 * 每次裁剪需要改变的y坐标值
172 * @param mediaTracker
173 * 媒体追踪器
174 * @param component
175 * 用来创建裁剪后的每个图片对象的组件
176 * @return 裁剪完并加载到内存后的二维图片数组
177 */
178 public static Image[][] cutAndAddImage(Image img, int rows, int columns,
179 int x, int y, int width, int height, int changeX, int changeY,
180 MediaTracker mediaTracker, Component component) {
181 // 创建剪裁后图像保存的二维数组
182 Image[][] images = new Image[rows][columns];
183 // 获取图像源
184 ImageProducer producer = img.getSource();
185 /* 循环剪裁图像 */
186 for (int i = 0; i < rows; i++) {
187 for (int j = 0; j < columns; j++) {
188 // 创建用于剪裁图像的过滤器
189 ImageFilter cropImageFilter = new CropImageFilter(x + j
190 * changeX, y + i * changeY, width, height);
191 // 剪裁源图像,保存剪裁后的图像
192 images[i][j] = component.createImage(new FilteredImageSource(
193 producer, cropImageFilter));
194
195 }
196 }
197 // 调用 使用媒体追踪器加载多张图像(二维数组) 的方法完成图像加载
198 return addImage(mediaTracker, images);
199 }
200 }