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 }

 

相关文章
|
5天前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:输入与输出:Scanner与System类
你是否也经历过这些崩溃瞬间?三天教程连`i++`和`++i`都说不清,面试时`a==b`与`equals()`区别大脑空白,代码总是莫名报NPE。这个系列就是为你打造的Java「速效救心丸」!每天1分钟,地铁通勤、午休间隙即可学习。直击高频考点和实际开发中的“坑位”,拒绝冗长概念,每篇都有可运行代码示例。涵盖输入输出基础、猜数字游戏、企业编码规范、性能优化技巧、隐藏技能等。助你快速掌握Java核心知识,提升编程能力。点赞、收藏、转发,助力更多小伙伴一起成长!
34 19
|
6天前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
36 11
|
12天前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
11天前
|
存储 Java 编译器
课时11:综合实战:简单Java类
本次分享的主题是综合实战:简单 Java 类。主要分为两个部分: 1.简单 Java 类的含义 2.简单 Java 类的开发
|
13天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
36 5
|
11天前
|
Oracle Java 关系型数据库
课时37:综合实战:数据表与简单Java类映射转换
今天我分享的是数据表与简单 Java 类映射转换,主要分为以下四部分。 1. 映射关系基础 2. 映射步骤方法 3. 项目对象配置 4. 数据获取与调试
|
1月前
|
安全 Java 编译器
JAVA泛型类的使用(二)
接上一篇继续介绍Java泛型的高级特性。3. **编译时类型检查**:尽管运行时发生类型擦除,编译器会在编译阶段进行严格类型检查,并允许通过`extends`关键字对类型参数进行约束,确保类型安全。4. **桥方法**:为保证多态性,编译器会生成桥方法以处理类型擦除带来的问题。5. **运行时获取泛型信息**:虽然泛型信息在运行时被擦除,但可通过反射机制部分恢复这些信息,例如使用`ParameterizedType`来获取泛型参数的实际类型。
|
1月前
|
安全 Java 编译器
JAVA泛型类的使用(一)
Java 泛型类是 JDK 5.0 引入的重要特性,提供编译时类型安全检测,增强代码可读性和可维护性。通过定义泛型类如 `Box&lt;T&gt;`,允许使用类型参数。其核心原理是类型擦除,即编译时将泛型类型替换为边界类型(通常是 Object),确保与旧版本兼容并优化性能。例如,`Box&lt;T&gt;` 编译后变为 `Box&lt;Object&gt;`,从而实现无缝交互和减少内存开销。
|
3月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
4月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。

热门文章

最新文章