JAVA 图像操作辅助类-阿里云开发者社区

开发者社区> 开发与运维> 正文

JAVA 图像操作辅助类

简介: 1 package util; 2 3 import java.awt.Component; 4 import java.awt.Image; 5 import java.
  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 }

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章