package util;

 import java.awt.Component;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer; /**
* 图像操作辅助类
*
* @author hellokitty燕
*
*/
public class ImageUtils { private ImageUtils() {
} /**
* 使用媒体追踪器加载单张图像
*
* @param mediaTracker
* 媒体追踪器
* @param image
* 待加载图像
* @return 加载完毕的图像
*/
public static Image addImage(MediaTracker mediaTracker, Image image) {
// 将图片放置到媒体追踪器的图片列表中,准备开始加载工作
mediaTracker.addImage(image, );
try {
// 加载所有图片
mediaTracker.waitForAll();
} catch (InterruptedException e) {
System.err.println(e.getMessage());
}
// 官方提供的标准处理代码
// & -- 按位与运算
// 如满足条件表达式,则说明图像加载出错
// statusAll(false) -- 返回媒体跟踪器跟踪的所有媒体状态,如图像未加载,也不会进行加载
if ((mediaTracker.statusAll(false) & MediaTracker.ERRORED) != ) {
System.err.println("图片加载出错...");
}
return image;
} /**
* 使用媒体追踪器加载多张图像(一维数组)
*
* @param mediaTracker
* 媒体追踪器
* @param images
* 待加载的一维数组中的图像
* @return 加载完毕的图像
*/
public static Image[] addImage(MediaTracker mediaTracker, Image[] images) {
for (int i = ; i < images.length; i++) {
mediaTracker.addImage(images[i], i);
}
try {
mediaTracker.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 官方提供的标准处理代码
// & -- 按位与运算
// 如满足条件表达式,则说明图像加载出错
// statusAll(false) -- 返回媒体跟踪器跟踪的所有媒体状态,如图像未加载,也不会进行加载
if ((mediaTracker.statusAll(false) & MediaTracker.ERRORED) != ) {
System.err.println("图片加载出错...");
}
return images;
} /**
* 使用媒体追踪器加载多张图像(二维数组)
*
* @param mediaTracker
* 媒体追踪器
* @param images
* 待加载的二维数组中的图像
* @return 加载完毕的图像
*/
public static Image[][] addImage(MediaTracker mediaTracker, Image[][] images) {
for (int i = ; i < images.length; i++) {
for (int j = ; j < images[i].length; j++) {
mediaTracker.addImage(images[i][j], i);
}
}
try {
mediaTracker.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 官方提供的标准处理代码
// & -- 按位与运算
// 如满足条件表达式,则说明图像加载出错
// statusAll(false) -- 返回媒体跟踪器跟踪的所有媒体状态,如图像未加载,也不会进行加载
if ((mediaTracker.statusAll(false) & MediaTracker.ERRORED) != ) {
System.err.println("图片加载出错...");
}
return images;
} /**
* 将传入的图片进行裁剪,裁剪后生成图像放入一维数组中保存,再进行图像加载。 通常用于裁剪所有图像在一行中的源图像
*
* @param img
* 待裁剪图像
* @param count
* 裁剪后的图像数量
* @param x
* 开始裁剪x坐标
* @param y
* 开始裁剪y坐标
* @param width
* 每次裁剪图像宽度
* @param height
* 每次裁剪图像高度
* @param changeX
* 每次裁剪需要改变的x坐标值
* @param mediaTracker
* 媒体追踪器
* @param component
* 用来创建裁剪后的每个图片对象的组件
* @return 裁剪完并加载到内存后的一维图片数组
*/
public static Image[] cutAndAddImage(Image img, int count, int x, int y,
int width, int height, int changeX, MediaTracker mediaTracker,
Component component) {
// 创建保存裁剪后图像的一维数组
Image[] images = new Image[count];
/* 循环裁剪图像 */
ImageProducer producer = img.getSource(); // 获取图像源
for (int i = ; i < count; i++) {
// 创建用于裁剪的图像过滤器
ImageFilter cropImageFilter = new CropImageFilter(x + i * changeX,
y, width, height);
// 裁剪源图像,将裁剪后的图像放入数组保存
images[i] = component.createImage(new FilteredImageSource(producer,
cropImageFilter));
} // 调用 使用媒体追踪器加载多张图像(一维数组) 的方法完成图像加载
return addImage(mediaTracker, images);
} /**
* 将传入的图片进行裁剪,裁剪后生成图像放入二维数组中保存,再进行图像加载 通常用于裁剪所有图像在多行多列中的源图像
*
* @param img
* 待裁剪图像
* @param rows
* 裁剪后的图像行数,即垂直方向上需要裁剪出的图片数量
* @param columns
* 裁剪后的图像列数,即水平方向上需要裁剪出的图片数量
* @param x
* 开始裁剪x坐标
* @param y
* 开始裁剪y坐标
* @param width
* 每次裁剪图像宽度
* @param height
* 每次裁剪图像高度
* @param changeX
* 每次裁剪需要改变的x坐标值
* @param changeY
* 每次裁剪需要改变的y坐标值
* @param mediaTracker
* 媒体追踪器
* @param component
* 用来创建裁剪后的每个图片对象的组件
* @return 裁剪完并加载到内存后的二维图片数组
*/
public static Image[][] cutAndAddImage(Image img, int rows, int columns,
int x, int y, int width, int height, int changeX, int changeY,
MediaTracker mediaTracker, Component component) {
// 创建剪裁后图像保存的二维数组
Image[][] images = new Image[rows][columns];
// 获取图像源
ImageProducer producer = img.getSource();
/* 循环剪裁图像 */
for (int i = ; i < rows; i++) {
for (int j = ; j < columns; j++) {
// 创建用于剪裁图像的过滤器
ImageFilter cropImageFilter = new CropImageFilter(x + j
* changeX, y + i * changeY, width, height);
// 剪裁源图像,保存剪裁后的图像
images[i][j] = component.createImage(new FilteredImageSource(
producer, cropImageFilter)); }
}
// 调用 使用媒体追踪器加载多张图像(二维数组) 的方法完成图像加载
return addImage(mediaTracker, images);
}
}

JAVA 图像操作辅助类的更多相关文章

  1. Java常用工具类之数据库操作辅助类DBUtil.java

    package com.qushida.util; import java.beans.BeanInfo; import java.beans.Introspector; import java.be ...

  2. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...

  3. DateHelper.cs日期时间操作辅助类C#

    //==================================================================== //** Copyright © classbao.com ...

  4. Java实现操作dos命令

    java实现操作dos命令的两种方式 1.读取文件中的命令 package com; import java.io.InputStream; public class cmd { public sta ...

  5. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  6. HT for Web基于HTML5的图像操作(三)

    上篇采用了HTML5的Canvas的globalCompositeOperation属性达到了染色效果,其实CSS也提供了一些常规图像变化的设置参数,关于CSS的过滤器Filter设置可参考 http ...

  7. java日期操作大全

    摘自(http://www.blogjava.net/i369/articles/83483.html) java日期操作 大全 先来一个:  取得指定月份的第一天与取得指定月份的最后一天  http ...

  8. Java CSV操作(导出和导入)

    Java CSV操作(导出和导入)  CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件 ...

  9. 2014 年10个最佳的PHP图像操作库

    2014 年10个最佳的PHP图像操作库   Thomas Boutell 以及众多的开发者创造了以GD图形库闻名的一个图形软件库,用于动态的图形计算. GD提供了对于诸如C, Perl, Pytho ...

随机推荐

  1. ES6 学习笔记之四 对象的扩展

    ES6 为对象字面量添加了几个实用的功能,虽然这几个新功能基本上都是语法糖,但确实方便. 一.属性的简洁表示法 当定义一个对象时,允许直接写入一个变量,作为对象的属性,变量名就是属性名. 例1: , ...

  2. [ASP.NET]NTKO插件使用常见问题

    一.环境要求 NTKO OFFICE文档控件能够在IE.谷歌Chrome.Firefox等浏览器中直接编辑MS Office.WPS.金山电子表.永中Office等文档并保存到WEB服务器.(标准版对 ...

  3. Angular6 学习笔记——指令

    angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...

  4. .net core获取服务器本地IP及Request访问端口

    string str = (Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + ...

  5. C#计算机性能参数

    Process proc = Process.GetCurrentProcess(); //string info = "内存:" + (Environment.WorkingSe ...

  6. 双缓冲队列解决WPF界面卡死

    工作中的项目,CS客户端会通过MQ接收前端设备发送的信息,之前测试的时候,由于测试的数据不大,没有进行压力测试,软件可以正常工作,随着项目现场设备数量的增加,CS客户端从MQ中订阅的数据量不断增加,最 ...

  7. wpf使用DynamicDataDisplay插件,修改x轴的样式,改成透明的。

    时光偷走的,永远都是我们眼皮底下看不见的珍贵. 问题:X轴会显示灰色拖动条. 解决:将X轴颜色改为透明. DDD插件是开源的,但是网上的参考资料却很少,所以,很多问题在网上搜索不到,因为没有找到该插件 ...

  8. Android Google Analytics

    基础知识: 一个统计条目包含两类,一种是 screen,另一种是 event. Screen 包括 screen name. Event 包括  category,action,label 和 val ...

  9. Python 使用 os 模块遍历目录/获取当前文件的路径

    1.列出指定目录下所包含的目录 item = os.listdir("/Users/jinchengxie/go") 返回的是一个列表, 里面包含了指定目录下所包含的所有的目录 2 ...

  10. fastAdmin根据状态显示是否显示操作按钮

    根据状态决定是否显示某个操作按钮 代码如下: