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. JdbcTemplate详解

    1.JdbcTemplate操作数据库 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中.同时,为了支 ...

  2. Spring框架事务支持模型的优势

    全局事务 全局事务支持对多个事务性资源的操作,通常是关系型数据库和消息队列.应用服务器通过JTA管理全局性事务,API非常烦琐.UserTransaction通常需要从JNDI获取,意味着需要与JND ...

  3. Tmux入门教程

      对于程序员来说效率绝对是最重要的,那我们今天就来介绍下一个能极大提高工作效率的软件Tmux.   Tmux 是一个工具,用于在一个终端窗口中运行多个终端会话.不仅如此,你还可以通过 Tmux 使终 ...

  4. visual studio code 中隐藏从 ts 文件生成的 js 文件和 map 文件

    typescript 文件编译产生的 js 和 map 文件不需要手工编辑,打开[文件][首选项][工作区设置],放入以下代码: // 将设置放入此文件中以覆盖默认值和用户设置. { "fi ...

  5. asp.net core 的用户注册功能——Identity上手

    首先请using这个类库. using Microsoft.AspNetCore.Identity; 这个类库老牛逼了,首先是包含了一个IdentityUser类.我们可以自己写一个User类继承Id ...

  6. BitAdminCore框架应用篇:(五)核心套件querySuite列的定义

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...

  7. akka开发(一)HelloWorld

    package com.hfi.helloakka; import akka.actor.ActorRef; import akka.actor.Props; import akka.actor.Un ...

  8. 「BZOJ1095」[ZJOI2007] Hide 捉迷藏

    题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条 ...

  9. Linux core 文件 gdb

    http://blog.csdn.net/mr_chenping/article/details/13767609 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时 ...

  10. ubuntu 16.04 安装Tensorflow

    ubuntu 16.04 安装Tensorflow(CPU) 安装python ubuntu 16.04自带python2.7,因此可以略过这一步 安装pip sudo apt-get install ...