Java 图片提取RGB数组 RGBOfCharMaps (整理)

简介: 1 package demo; 2 3 /** 4 * Java 图片提取RGB数组 RGBOfCharMaps (整理) 5 * 声明: 6 * 和ImageCombining配合使用的工具,这里是提取图片的R、G、B生成数组,放入文件 7 * 中,给ImageCombining进行图片合成。
  1 package demo;
  2 
  3 /**
  4  *                Java 图片提取RGB数组 RGBOfCharMaps (整理)
  5  * 声明:
  6  *     和ImageCombining配合使用的工具,这里是提取图片的R、G、B生成数组,放入文件
  7  * 中,给ImageCombining进行图片合成。
  8  *
  9  *                                             2016-1-2 深圳 南山平山村 曾剑锋
 10  */
 11 
 12 import java.awt.image.BufferedImage;
 13 import java.io.BufferedOutputStream;
 14 import java.io.File;
 15 import java.io.FileOutputStream;
 16 import java.io.IOException;
 17 import java.util.regex.Matcher;
 18 import java.util.regex.Pattern;
 19 import javax.imageio.ImageIO;
 20 import javax.swing.JFileChooser;
 21 import javax.swing.filechooser.FileNameExtensionFilter;
 22 
 23 public class RGBOfCharMaps{
 24     /** 声明一个文件选择器引用 */
 25     static JFileChooser jFileChooser = null;
 26     /** 用于保存您选择的单个或者多个文件路径集合, 初始化为null */
 27     static File filePath = null;
 28     /** 保存图片的宽、高 */
 29     static int imageWidth = 0;
 30     static int imageHeight = 0;
 31     /** 图像缓冲引用 */
 32     static BufferedImage bufferedImage = null;
 33     /**
 34      * main()函数,完成任务如下:<br><ol>
 35      *         <li>对文件选择器进行初始化;<br>
 36      *         <li>保存转换好的文件;<br>
 37      *         <li>如果出现异常,给出提示信息。<br></ol>
 38      */
 39     public static void main(String[] args) {
 40         try {
 41             filesSelectInit();
 42             System.out.println(1);
 43             if (getImageFile()) {
 44                 fileSave();  
 45                 System.out.println(imageHeight);
 46                 System.out.println(imageWidth);
 47             };
 48               
 49         } catch (Exception e) {
 50             //System.out.println("请选择后缀为png/PNG/jpeg/jpe/JPEG的文件");
 51             System.out.println(e);
 52         }
 53     }
 54 
 55 
 56     private static boolean getImageFile() throws IOException {
 57         if (jFileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
 58             filePath = jFileChooser.getSelectedFile();
 59             if (fileSuffixCheck(filePath)) {
 60                 bufferedImage = ImageIO.read(filePath);
 61                 imageWidth = bufferedImage.getWidth();
 62                 imageHeight = bufferedImage.getHeight();
 63                 return true;
 64             }
 65         }
 66         return false;
 67     }
 68 
 69 
 70     /**
 71      * 文件后缀检查函数,完成任务如下:<br>
 72      * &nbsp &nbsp &nbsp &nbsp
 73      *         采用正则表达式对文件进行匹配。<br>
 74      */
 75     private static boolean fileSuffixCheck(File filePath) {
 76         //使用正则表达式来防止选择目前不支持的文件,目前只支持png/PNG/jpeg/jpe/JPEG格式图片
 77         Pattern pattern = Pattern.compile(".+[.][pPJj][nNpP][eEgGpP][gG]?");
 78         Matcher matcher = pattern.matcher(filePath.getName());
 79         if (matcher.matches() == false) {
 80             return false;
 81         }
 82         return true;
 83     }
 84     /**
 85      * 文件保存函数,完成任务如下:<br><ol>
 86      *         <li>设置一个文件保存的路径,这个路径可以自己修改;<br>
 87      *         <li>创建文件路径下的文件缓冲区;<br>
 88      *         <li>将charMaps中的字符写好文件中,忽略在上、下、左、右边界之外的部分,只将边界内的字符输出;<br>
 89      *         <li>每写完一行字符,进行换行;<br>
 90      *         <li>最后关闭文件缓冲区,如果不关闭,文件缓冲区内的字符可能不会写到文件中,请注意;<br>
 91      *         <li>提示完成以及提示文件路径。<br><ol>
 92      */
 93     private static void fileSave() {
 94         File[] saveFilePath = new File[3];
 95         saveFilePath[0] = new File("/home/soft1/B.txt");
 96         saveFilePath[1] = new File("/home/soft1/G.txt");
 97         saveFilePath[2] = new File("/home/soft1/R.txt");
 98         try {
 99             SaveRGB(saveFilePath);    
100         } catch (IOException e1) {
101             e1.printStackTrace();
102         }
103     }
104 
105     private static void SaveRGB(File[] saveFilePath) throws IOException {
106         String[] RGB = {"Blue","Green","Red"};
107         StringBuilder stringBuilder = new StringBuilder(); 
108         for (int i = 0; i < saveFilePath.length; i++) {
109             BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(saveFilePath[i]));
110             singleColorSave(stringBuilder,bufferedOutputStream,i);
111             System.out.println("CharMaps已完成颜色"+RGB[i]+"工作,请到"+saveFilePath[i].getPath()+"中查看结果 ^_^\n");
112         }        
113     }
114     private static void singleColorSave(StringBuilder stringBuilder,
115             BufferedOutputStream bufferedOutputStream, int i) throws IOException {
116         stringBuilder.append('{');
117         for (int row = 0; row < imageHeight; row++) {
118             stringBuilder.append('{');
119             for (int col = 0; col < imageWidth; col++) {
120                 int rgb = bufferedImage.getRGB(col, row);
121                 int singleColor = ((rgb >> (8*i))&0xff);
122                 stringBuilder.append(singleColor);
123                 stringBuilder.append(',');
124             }
125             stringBuilder.append('}');
126             if (row == imageHeight-1) {
127                 stringBuilder.append('}');
128             }else {
129                 stringBuilder.append(',');
130             }
131             byte[] byteWrite = (byte[])stringBuilder.toString().getBytes();
132             bufferedOutputStream.write(byteWrite, 0, stringBuilder.length());
133             bufferedOutputStream.write('\n');
134             bufferedOutputStream.flush();
135             stringBuilder.delete(0, stringBuilder.length());
136         }
137         bufferedOutputStream.close();
138     }
139 
140 
141     /**
142      * 文件选择对话框初始化函数,Init是初始化的英文单词缩写,完成任务如下:<br><ol>
143      *         <li>提示欢迎使用CharMaps;<br>
144      *         <li>创建文件选择对话框;<br>
145      *         <li>创建文件选择过滤器;<br>
146      *         <li>将文件选择过滤器添加进入文件对话框,还句话说是:使文件选择过滤器有效;<br>
147      *         <li>将文件选择对话框设置为可以多选;<br>
148      *         <li>提示完成初始化。<br></ol>
149      */
150     private static void filesSelectInit() {
151         System.out.println("\n\t欢迎使用RGBOfCharMaps");
152         jFileChooser = new JFileChooser();
153         FileNameExtensionFilter filter = new FileNameExtensionFilter(
154                 "Images", "jpg", "png","PNG","JPG","jpe","JPE");
155         jFileChooser.setFileFilter(filter);
156         System.out.println("1、完成文件选择初始化");
157     }
158 }

 

RGBOfCharMaps
目录
相关文章
|
3月前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
4月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
5月前
|
存储 Java 索引
java 数组
在 Java 中,数组是一种数据结构,用于存储多个相同类型的数据元素。数组的大小一旦创建后就不能改变,因此它是固定长度的。Java 数组是一种 对象,即使它存储的值是基本类型(如 int、double 等),它也是一个对象引用。
149 0
|
7月前
|
存储 人工智能 Java
打乱数组内容引发的问题( Java)
本文介绍了两种实现数组随机打乱的方法,并深入探讨了Java中原始数据类型与对象类型的差异。方法一通过自定义随机数交换数组元素位置,方法二借助`Collections.shuffle()`函数完成数组打乱。同时,文章详细解析了`int`和`Integer`的区别,包括声明方式、内存占用、初始化以及对象特性等,并讲解了自动装箱与拆箱的功能,帮助读者更好地理解Java的基础知识。
121 0
|
8月前
|
前端开发 JavaScript Java
Java中将图片转换为base64格式的技巧
这样,你就可以在Java中将图片转换为Base64格式了。这个方法的实现非常简单,只需要使用Java的内置库,无需任何额外的库。希望这个方法对你有所帮助。
480 22
|
8月前
|
存储 Java 数据挖掘
Java 中数组的多种定义方式
本文深入解析了Java中数组的多种定义方式,涵盖基础的`new`关键字创建、直接初始化、动态初始化,到多维数组、`Arrays.fill()`方法以及集合类转换为数组等高级用法。通过理论与实践结合的方式,探讨了每种定义方法的适用场景、优缺点及其背后的原理,帮助开发者掌握高效、灵活的数组操作技巧,从而编写更优质的Java代码。
403 0
|
9月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
600 1
Java 中数组Array和列表List的转换
|
9月前
|
存储 Java 索引
Java 复制数组
本文介绍了Java中数组的基础知识与常用操作,包括数组的概念、创建、访问元素、遍历、复制、排序和搜索等方法。同时详细讲解了数组的五种赋值方式,并通过代码示例演示了求总和平均值、最大最小值、升序降序排序及Arrays类的常用方法。内容深入浅出,适合初学者学习掌握Java数组的核心功能与应用场景。
125 2
|
9月前
|
存储 监控 Java
《从头开始学java,一天一个知识点》之:数组入门:一维数组的定义与遍历
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。明日预告:《多维数组与常见操作》。 通过实例讲解数组的核心认知、趣味场景应用、企业级开发规范及优化技巧,帮助你快速掌握Java数组的精髓。
202 23