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. java web 入门实例servlet篇(显示后台数据库列表,删除某一条记录并显示)

    编写过程中需要注意的问题: 1.建立eclipse动态web工程时,需要改写编译后class文件的位置,通常情况下是这个位置:/WebContent/WEB-INF/classes 2.配置的页面链接 ...

  2. 团队项目(第四周之一)—GG队

    Alpha认领任务: 叶尚文:对应键盘监听结果的动画以及计算 于泽浩:制作背景gif图,并保证能在程序中循环播放 龙剑初:项目进度跟进及博客更新 杜婷萱:把图片结合起来,设置云朵透明度的变化 蔡晓晴: ...

  3. C# 如何防止重放攻击(转载)

    转载地址:http://www.cnblogs.com/similar/p/6776921.html 重放攻击 重放攻击是指黑客通过抓包的方式,得到客户端的请求数据及请求连接,重复的向服务器发送请求的 ...

  4. 打开AVD时报”Data partition already in use. Changes will not persist!”

    错误信息 WARNING: Data partition already in use. Changes will not persist! WARNING: SD Card image alread ...

  5. 第1章 敏捷思维—“互联网+”知识工作者必备的DNA

    1.1  强化敏捷思维,落实“十三五”双创战略 史蒂夫·布兰克观察美国创业环境,提出创新生态四个方面:动机.管理工具.文化.基础建设,开创LLP创新创业模式. 1.2  现代敏捷管理发展趋势 1.敏捷 ...

  6. Git小技巧:VIM中如何填写注释信息

    使用Git命令行工具的时候,经常一不小心就进入VIM界面,例如git commit没有填写任何描述信息.对于习惯了Windows可视化操作界面的用户,可能一下子会觉得无所适从,只能在键盘上一顿短按.下 ...

  7. CentOS7查看CPU个数

    查看逻辑cpu个数:cat /proc/cpuinfo | grep "processor" | wc -l 查看物理cpu个数:cat /proc/cpuinfo | grep ...

  8. __setattr__,__getattr__

    class A(object): def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, ...

  9. python小数的进位与舍去

    一.基础知识准备 ​ 奇进偶舍,又称为四舍六入五成双规则.银行进位法(Banker's Rounding),是一种计数保留法,是一种数值修约规则.从统计学的角度,"奇进偶舍"比&q ...

  10. BZOJ 4517--[Sdoi2016]排列计数(乘法逆元)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1727  Solved: 1067 Description ...