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 }