博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA 图像操作辅助类
阅读量:6135 次
发布时间:2019-06-21

本文共 6397 字,大约阅读时间需要 21 分钟。

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 img112      *            待裁剪图像113      * @param count114      *            裁剪后的图像数量115      * @param x116      *            开始裁剪x坐标117      * @param y118      *            开始裁剪y坐标119      * @param width120      *            每次裁剪图像宽度121      * @param height122      *            每次裁剪图像高度123      * @param changeX124      *            每次裁剪需要改变的x坐标值125      * @param mediaTracker126      *            媒体追踪器127      * @param component128      *            用来创建裁剪后的每个图片对象的组件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 img155      *            待裁剪图像156      * @param rows157      *            裁剪后的图像行数,即垂直方向上需要裁剪出的图片数量158      * @param columns159      *            裁剪后的图像列数,即水平方向上需要裁剪出的图片数量160      * @param x161      *            开始裁剪x坐标162      * @param y163      *            开始裁剪y坐标164      * @param width165      *            每次裁剪图像宽度166      * @param height167      *            每次裁剪图像高度168      * @param changeX169      *            每次裁剪需要改变的x坐标值170      * @param changeY171      *            每次裁剪需要改变的y坐标值172      * @param mediaTracker173      *            媒体追踪器174      * @param component175      *            用来创建裁剪后的每个图片对象的组件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 + j190                         * 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 }

 

转载地址:http://rirua.baihongyu.com/

你可能感兴趣的文章
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
【FJOI2015】金币换位问题
查看>>
数学之美系列二十 -- 自然语言处理的教父 马库斯
查看>>
Android实现自定义位置无标题Dialog
查看>>
面试总结
查看>>
Chrome浏览器播放HTML5音频没声音的解决方案
查看>>
easyui datagrid 行编辑功能
查看>>
HDU 2818 (矢量并查集)
查看>>
实验二 Java面向对象程序设计
查看>>
------__________________________9余数定理-__________ 1163______________
查看>>
webapp返回上一页 处理
查看>>
新安装的WAMP中phpmyadmin的密码问题
查看>>
20172303 2017-2018-2 《程序设计与数据结构》第5周学习总结
查看>>
eclipse中将一个项目作为library导入另一个项目中
查看>>
Go语言学习(五)----- 数组
查看>>
Android源码学习之观察者模式应用
查看>>
416. Partition Equal Subset Sum
查看>>