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 }

 

相关文章
|
2天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
23 3
|
6天前
|
Java 编译器
Java Character 类
4月更文挑战第13天
|
7天前
|
存储 Java
Java基础教程(7)-Java中的面向对象和类
【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
|
11天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
12 0
|
11天前
|
Java
Java 15 神秘登场:隐藏类解析未知领域
Java 15 神秘登场:隐藏类解析未知领域
15 0
|
13天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
21 9
|
13天前
|
JavaScript Java 测试技术
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
30 0
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
|
14天前
|
存储 安全 Java
java多线程之原子操作类
java多线程之原子操作类
|
15天前
|
Java
Java中的异常类总结
Java中的异常类总结
|
15天前
|
Java
Java中的多线程实现:使用Thread类与Runnable接口
【4月更文挑战第8天】本文将详细介绍Java中实现多线程的两种方法:使用Thread类和实现Runnable接口。我们将通过实例代码展示如何创建和管理线程,以及如何处理线程同步问题。最后,我们将比较这两种方法的优缺点,以帮助读者在实际开发中选择合适的多线程实现方式。
21 4