/** @(#)CharMaps.java     2014/1/16*         1、这个一个Java程序,感谢您花费大量时间阅读本文档;*         2、本人知道大家并不喜欢看大量文字描述,但实属无奈,因为我们的沟通只能通过文字;*         3、当您在复制、粘贴的时候请注意包名为:practice,文件名为:CharMaps,以防止一些不必要的麻烦;*         4、下面这张由字符组成的图是直接由图片生成的,信与不信由您决定,另外可以肯定的是本人绝对不会一个字一个敲这幅图;*         5、如果想知道她是如何完成的,请看完CharMaps类前面的全部注释,因为她是工具,有些内容需要了解、素材需要准备;*         6、本次注释参考了MyEclipse的注释风格,相对比上次来说注释要规范一些,但由于本人经验、认知水平有限,可能很多地方没有*             考虑完全,或者没有解释清楚,请谅解。
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢一一一一虢虢虢虢一一一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一一一虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢一一一虢虢虢一一虢一虢一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一一一一一一一一虢虢虢虢虢虢虢虢
虢虢虢虢虢虢一虢一虢虢虢一一一一一一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢一一一一一虢虢虢虢一一一一一虢虢虢虢虢虢
虢虢虢虢虢一一虢虢虢虢虢一一虢虢虢一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢
虢虢虢虢虢一虢虢虢虢虢虢虢一一一一一虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢一一一虢虢虢虢一一一一虢虢虢虢一一一虢虢虢虢
虢虢虢虢一一虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢一一一一一一一一虢虢虢一一一虢虢虢
虢虢虢虢一一一虢虢虢虢虢一一一一一一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一虢虢虢一一一一一一一一一一一虢虢一一虢虢虢
虢虢虢虢一虢一一虢虢虢一一虢一一一虢一虢虢虢虢一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一虢虢虢一一一一虢虢虢虢一一一一虢虢虢一一虢虢
虢虢虢虢一虢虢一一虢一一虢虢一一一虢一一虢虢虢一虢虢虢虢虢一一一虢虢一一一一一虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢一一一一虢虢虢虢虢虢一一一一虢虢一一虢虢
虢虢虢一一虢虢虢一一一虢虢虢一一一虢虢一一虢一一虢虢虢虢虢一一一虢一一一一一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢一一一虢虢虢一一虢虢虢一一一虢虢一一虢虢
虢虢虢一虢虢虢虢虢虢虢虢一一一一一虢虢虢一一一虢虢虢虢虢虢一一一一一虢虢虢虢一一一虢虢虢虢虢虢一一一虢虢虢虢虢一一虢虢一一一虢虢虢一一一一虢虢虢一一一虢虢一一虢
虢虢一一虢虢虢虢虢虢虢虢一一一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一一虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢一一虢虢一一一虢虢一一虢虢一一虢虢一一一虢虢一一虢
虢虢一虢虢虢虢虢虢虢虢虢一虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢一一虢虢一一一虢虢一一虢虢一一虢虢一一一虢虢一一虢
虢虢一虢虢虢虢虢虢虢虢虢一虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢一一虢虢一一一虢虢虢一一一一虢虢虢一一一虢虢一一虢
虢虢一虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢一一一虢虢虢一一虢虢虢一一一虢虢一一虢虢
虢一一虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢一一一一虢虢虢虢虢虢一一一一虢虢一一虢虢
虢一虢虢虢虢虢虢虢虢虢虢一一一虢一一虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢虢一一一一虢虢虢虢一一一一虢虢虢一一虢虢
虢一虢虢一虢虢虢虢虢虢虢一虢虢虢虢一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢一一虢虢一一一一一一一一一一一虢虢虢一一虢虢虢
虢虢虢虢一一虢虢虢虢虢一一虢虢虢虢虢一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢一一一一一一一一虢虢虢一一一虢虢虢
虢虢虢虢虢一一虢虢虢一一虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢一一一虢虢虢虢一一一一虢虢虢虢一一一虢虢虢虢
虢虢虢虢虢虢一一虢虢一虢虢虢虢虢虢虢一一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢
虢虢虢虢虢虢虢一一一一虢虢虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢一一一一一虢虢虢虢一一一一一虢虢虢虢虢虢
虢虢虢虢虢虢虢虢一一虢虢虢虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一一一一一一一一虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一一虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢*/
package practice;
import java.awt.p_w_picpath.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.p_w_picpathio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
/**** <p>* <h4>一、软件声明:</h4><br><ol>*         <li>该软件是为了解决培训期间TTS无法上图的原因才写出来的,同时感谢您花费宝贵的时间来阅读本文档;<br>*        <li>如果您打算使用这个小工具,那么请阅读完这个这整段注释;*         <li>如果您只是路过,那么您可以也可以猫一眼 ^_^,不过我相信她不会让您失望的;<br>*         <li>该软件已被我命名为CharMaps,在后面的注释中,我说明了命名理由 ^_^;<br>*         <li>TTS最小字号是9px阻碍了CharMaps的强大功能,但CharMaps至少能缓解一下我们对图片的向往,希望TTS以后会放宽规则;<br>*    *         该小工具被我命名为:CharMaps,没有抄袭他人的思路,是根据自己的需求写的,希望她能给您带来乐趣<br>* </ol></p>** <p>* <h4>二、CharMaps由来:</h4><br><ol>*         <li>CharMaps制作初衷是因为TTS不能上图,之前上传《动态写轮眼(火影)——Java原创》系列软件时感觉实在不爽,所以自己通过*                自己目前的认知水平写了这个CharMaps。<br>*         <li>灵感来自硬件传感器——摄像头——的工作原理,有兴趣的朋友可以去找下度娘或者谷哥,听说他们很懂的样子。 ^_^<br>*</ol></p>** <p>* <h4>三、CharMaps命名解析:</h4><br><ol>*         <li>Char代表字符,因为她将图片里对一个的像素转换成了字符,为什么是字符而不是字节?原因在于字节宽高比大约是1:2.5,*                而字符的宽高大约是1:1,我说的是大约 ^_^;<br>*        <li>Map是代表输出的就像每张图片一个映射(map);<br>*        <li>s是因为能同时处理多张图片;<br>*        <li>最终组合为CharMaps,很优雅的名字,^_^ ;<br>*</ol></p>** <p>* <h4>四、CharMaps知识预备:</h4><br><ol>*         <li>CharMaps采用了具有RGB(red,green,blue)三基色的图片,后缀名为png/PNG/jpeg/jpe/JPEG,但只能处理黑白*                 图,原因是黑白图在三基色上是平均分布的,而CharMaps仅是依靠blue分量进行图片处理。<br>*         <li>如果您手上没有黑白图,您可以使用我们使用的操作系统自带的The GIMP,该软件自带了离线中文帮助文档,界面挺清爽*                 的,您可以通过以下途径打开:应用程序 ——> 图像 ——> The GIMP,如果您不会使用,那就看看帮助文档吧,如果*                 您以前使用Photoshop(PS),估计您会有很熟悉的感觉,您以前投资在PS上的时间终于得到了有效回报, ^_^。<br>* </ol></p>** <p>* <h4>五、CharMaps缺陷:</h4><br><ol>*         <li>目前只支持黑白图,其他的图不保证效果,主要是写复杂了不利于学习交流,简单并能提供一些思路,并且每个人可以根据*                 自己需要进行功能改进或者定制才是沟通学习的王道;<br>*         <li>所能转换的图片目前默认支持宽:int charMapsCol = 2000;高:int charMapsRow = 1000;您自己可以修改;<br>*         <li>没有提供图片的自动缩放功能,所以不要操作默认支持的宽高,或者你自己修改的宽高;<br>*         <li>目前没有发现Bug,不保证您在使用的时候会不会出现Bug,就算遇到了,相信您也能够独立解决,TTS不提供沟通讨论,没办法,*                 另外本软件代码行数150左右(不包括注释),您懂的 ;^_^<br>*         <li>如果这个小软件给您带来了不必要的麻烦,本人向您表示歉意。<br>* </ol></P>** <p>* <h4>六、CharMaps操作流程:</h4><br><ol>*         <li>准备好一张或者多张后缀是png/PNG/jpeg/jpe/JPEG的文件,运行本程序;<br>*         <li>在文件选择框选择要转换的后缀是png/PNG/jpeg/jpe/JPEG的文件,选择完成后点“打开”按钮;不选择就会得到一个空文件;<br>*         <li>根据Console提示框中内容找到输出文件,默认是路径/home/soft1/charMaps.txt,您可以自己修改;<br>*         <li>用文本编辑器打开,把字号(不是字体)改成2px,看看效果吧。<br>* </ol></p>** <p>* <h4>七、CharMaps工作流程图(非代码分析的朋友可以略过):</h4><br><ol>*             本次注释参考了MyEclipse的注释风格,注释尽量简洁,没有添加过多的额外的注释,以下为main()函数工作流程层次:<br>*             <ul>*         <li>|--filesSelectInit() //初始化文件选择器,主要用于过滤掉一些后缀不是png/PNG/jpeg/jpe/JPEG的文件,方便选择文件;<br>*         <li>|--charMapsInit()     //初始化charMaps数组,并以字符‘虢’填充,主要是笔画多,作为黑色背景好,还有就是字里有老虎 ^_^;<br>*         <li>|--ImageProcessing() //图片处理函数,里面包含了如何对图片进行处理的方法;<br>*         <ul><li>|--singleImageProcessing() //单张图片处理函数;<br>*             <ul><li>|--fileSuffixCheck()   //文件后缀检查,采用了正则表达式,主要是为了防止有些朋友选错;<br>*                 <li>|--ImageSizeCheck()       //图片大小检查,主要是因为charMaps大小已由charMapsRow和charMapsCol固定了;<br>*                 <li>|--ImageMapToCharMaps() //将图片(Image)映射(map)到charMaps,所有的图片都是以charMaps中心点进行映射*                                                 这个步骤中把每张图片的没有内容的边框裁减掉了;<br>*             </ul>*         </ul>*         <li>|--addFrameForCharMaps()//如果转换的图片尺寸没有大于charMaps,那么给图片加个框,您可以通过注释掉这一行*                                         看有这个函数和没有这个函数的区别;<br>   *         <li>|--fileSave()         //将最终的结果保存起来,路径已经固定,如果您有需要的话可以自己修改里面的路径。<br>* </ul></ol></P>* @author 曾剑锋<br>* @date 2014-1-16<br>*/
public class CharMaps{/** 声明一个文件选择器引用 */static JFileChooser jFileChooser = null;/***&nbsp &nbsp &nbsp &nbsp*      在很多时候,我们在转换成为字符的时候,上、下、左、右总有我们那些我们不需要的一些行,这行不*是我们自己需要的,我们还让软件帮我们处理掉吧,默认赋值有那么点讲究,您应该能看懂的,其实跟后面*的判断取值有关,初始化值是根据小的取大值,大的取小值的方式,您自己可以看着取。**/static int firstOfUpRow = Integer.MAX_VALUE;static int firstOfCol = Integer.MAX_VALUE;static int lastOfUpRow = Integer.MIN_VALUE;static int lastOfCol = Integer.MIN_VALUE;/*** charMapsRow用于定义charMaps的行数<br>* charMapsCol用于定义charMaps的列数<br>*/static int charMapsRow = 1000;static int charMapsCol = 2000;static char[][] charMaps = null;/** 用于保存您选择的单个或者多个文件路径集合, 初始化为null */static File[] filePaths = null;/** 保存图片的宽、高 */static int p_w_picpathWidth = 0;static int p_w_picpathHeight = 0;/*** &nbsp &nbsp &nbsp &nbsp*       在多张图片处理时候,每张图片处理使用不同的字符区别,charSelectindex用于计数,10个字符循环,* 如果一个charMaps同一个位置上字符会被后面的字符替代,如果没有则保持之前的字符<br>*/static int charSelectindex = 0;static char[] charSelects = {'一','二','三','四','五','六','七','八','九','十'};/** 图像缓冲引用 */static BufferedImage bufferedImage = null;/*** main()函数,完成任务如下:<br><ol>*         <li>对文件选择器进行初始化;<br>*         <li>对charMaps二维数组进行初始化;<br>*         <li>对已选择的图片集进行处理;<br>*         <li>由于图片集处理函数对图片有效边界进行了记录,调用addFrameForCharMaps(),添加在上、下、左、右各*             添加一个字符的边框,使输出的CharMaps转换出来的图更具视觉效果;<br>*         <li>保存转换好的文件;<br>*         <li>如果出现异常,给出提示信息。<br></ol>*/public static void main(String[] args) {try {filesSelectInit();charMapsInit();ImageProcessing();addFrameForCharMaps();fileSave();   } catch (Exception e) {System.out.println("请选择后缀为png/PNG/jpeg/jpe/JPEG的文件");}}/*** 图像处理函数,完成任务如下:<br><ol>*         <li>判断jFileChooser是否按下了打开;<br>*         <li>获取一个或者多个文件,保存于filePaths中;<br>*         <li>使用for循环迭代分成单张图片依次处理,调用singleImageProcessing()函数处理;<br>*         <li>图片处理完给出提示。<br></ol>*/private static void ImageProcessing() throws IOException {//判断是否在文件选择框上点了确定if (jFileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {filePaths = jFileChooser.getSelectedFiles();for (File filePath : filePaths) {singleImageProcessing(filePath);}System.out.println("完成图像处理");}}/*** 单张图片处理函数,完成任务如下:<br><ol>*         <li>调用文件后缀检查函数fileSuffixCheck(),防止因操作失误而引发的异常;<br>*         <li>调用图片尺寸检查函数ImageSizeCheck(),防止图片尺寸过大,因为没有提供图片缩放功能;<br>*         <li>调用图片映射函数ImageMapToCharMaps(),将图片的像素点映射到CharMaps数组中;<br>*         <li>如果是多张图片的charSelectindex完成对charSelects数组中10个字符的自动选择。<br></ol>** @param filePath    传入filePath进行检查,在返回回来,如果不行就抛弃。<br>* @throws IOException<br>*/private static void singleImageProcessing(File filePath) throws IOException {filePath = fileSuffixCheck(filePath);ImageSizeCheck(filePath);ImageMapToCharMaps();charSelectindex = charSelectindex++ % 10;}/*** 为charMaps添加边框,完成任务如下:<br>* &nbsp &nbsp &nbsp &nbsp*         如果有效的图形区域小于charMaps数组大小,在上、下、左、右按条件添加一个字符的边框,使输出的CharMaps转换出来的图更具视觉效果;<br>*/private static void addFrameForCharMaps() {firstOfCol = firstOfCol > 0 ? firstOfCol-1 : 0;firstOfUpRow = firstOfUpRow > 0 ? firstOfUpRow-1 : 0;lastOfCol = lastOfCol < charMapsCol ? lastOfCol+1 : charMapsCol;lastOfUpRow = lastOfUpRow < charMapsRow ? lastOfUpRow+1 : charMapsRow;}/*** 图片映射函数,完成任务如下:<br><ol>*         <li>双重循环获取图片的宽高;<br>*         <li>读出图片对应的坐标的RGB值<br>*         <li>判断对应坐标点的RGB是背景还是需要转换,这里之使用了B(blue)的值,判断,这也是为什么目前的*             CharMaps只能处理黑白图,当然应该也可以处理白蓝 ^_^<br>*         <li>对符合要求的的像素点改变charMaps对应点的字符<br>*         <li>对符合要求的像素进行边界检测,主要是完成对图片的边沿检查<br></ol>*/private static void ImageMapToCharMaps() {for (int i = 0; i < p_w_picpathHeight; i++) {for (int j = 0; j < p_w_picpathWidth; j++) {int rgb = bufferedImage.getRGB(j, i);if ((rgb&0xff)<128 ) {charMaps[charMaps.length/2-p_w_picpathHeight/2+i][charMaps[0].length/2-p_w_picpathWidth/2+j] = charSelects[charSelectindex];boundedRangeOfImage(i,j);}}}}/*** 图片边界范围检查函数,完成任务如下:<br>* &nbsp &nbsp &nbsp &nbsp*         主要是完成检查当前点是否是图片的有效边缘,对图片上、下、左、右有效区域进行查找,为后面保存时裁剪作准备。<br>* @param i 当前点的行号* @param j 当前点的列号*/private static void boundedRangeOfImage(int i, int j) {//记录图形中最上面开始出现图形行号if (charMaps.length/2-p_w_picpathHeight/2+i<firstOfUpRow) {firstOfUpRow = charMaps.length/2-p_w_picpathHeight/2+i;}//记录图形中最下面开始不再出现图形行号if (charMaps.length/2-p_w_picpathHeight/2+i>lastOfUpRow) {lastOfUpRow = charMaps.length/2-p_w_picpathHeight/2+i;}//记录图形中一行里面开始出现图形列号if (charMaps[0].length/2-p_w_picpathWidth/2+j<firstOfCol) {firstOfCol = charMaps[0].length/2-p_w_picpathWidth/2+j;}//记录图形中一行里面开始不再出现图形列号if (charMaps[0].length/2-p_w_picpathWidth/2+j>lastOfCol) {lastOfCol = charMaps[0].length/2-p_w_picpathWidth/2+j;}}/*** 图片尺寸检查函数,完成任务如下:<br>* &nbsp &nbsp &nbsp &nbsp*         主要是完成对图片的尺寸进行检查,不要比默认设置或者自己定制的charMaps数组大。<br>*/private static void ImageSizeCheck(File filePath) throws IOException {bufferedImage = ImageIO.read(filePath);//得到图片的长宽p_w_picpathWidth = bufferedImage.getWidth();p_w_picpathHeight = bufferedImage.getHeight();if ((charMapsRow < p_w_picpathHeight) || (charMapsCol < p_w_picpathWidth)) {System.out.println("图片宽因该小于2000,高小于1000");return ;}       }/*** 文件后缀检查函数,完成任务如下:<br>* &nbsp &nbsp &nbsp &nbsp*         采用正则表达式对文件进行匹配。<br>*/private static File fileSuffixCheck(File filePath) {//使用正则表达式来防止选择目前不支持的文件,目前只支持png/PNG/jpeg/jpe/JPEG格式图片Pattern pattern = Pattern.compile(".+[.][pPJj][nNpP][eEgGpP][gG]?");Matcher matcher = pattern.matcher(filePath.getName());if (matcher.matches() == false) {return null;}return filePath;}/*** charMaps初始化函数,Init是初始化的英文单词缩写,完成任务如下:<br>* &nbsp &nbsp &nbsp &nbsp*         完成对charMaps初始化,并提示完成。<br>*/private static void charMapsInit() {charMaps = new char[charMapsRow][charMapsCol];//记得需要初始化,否则好像出不来值for (int i = 0; i < charMaps.length; i++) {Arrays.fill(charMaps[i], '虢');}   System.out.println("完成charMaps数组初始化");}/*** 文件保存函数,完成任务如下:<br><ol>*         <li>设置一个文件保存的路径,这个路径可以自己修改;<br>*         <li>创建文件路径下的文件缓冲区;<br>*         <li>将charMaps中的字符写好文件中,忽略在上、下、左、右边界之外的部分,只将边界内的字符输出;<br>*         <li>每写完一行字符,进行换行;<br>*         <li>最后关闭文件缓冲区,如果不关闭,文件缓冲区内的字符可能不会写到文件中,请注意;<br>*         <li>提示完成以及提示文件路径。<br><ol>*/private static void fileSave() {File saveFilePath = new File("/home/soft1/charMaps.txt");try {BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(saveFilePath));for (int i = 0; i < charMaps.length; i++) {if ((i >= firstOfUpRow) && (i <= lastOfUpRow)) {bufferedWriter.write(charMaps[i], firstOfCol, lastOfCol-firstOfCol+1);bufferedWriter.newLine();}}bufferedWriter.close();} catch (IOException e1) {e1.printStackTrace();}System.out.println("完成文件保存");System.out.println("CharMaps已完成完成工作,请到"+saveFilePath.getPath()+"中查看结果 ^_^");}/*** 文件选择对话框初始化函数,Init是初始化的英文单词缩写,完成任务如下:<br><ol>*         <li>提示欢迎使用CharMaps;<br>*         <li>创建文件选择对话框;<br>*         <li>创建文件选择过滤器;<br>*         <li>将文件选择过滤器添加进入文件对话框,还句话说是:使文件选择过滤器有效;<br>*         <li>将文件选择对话框设置为可以多选;<br>*         <li>提示完成初始化。<br></ol>*/private static void filesSelectInit() {System.out.println("\t欢迎使用CharMaps");jFileChooser = new JFileChooser();FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "jpg", "png","PNG","JPG","jpe","JPE");jFileChooser.setFileFilter(filter);jFileChooser.setMultiSelectionEnabled(true);System.out.println("完成文件选择初始化");}
}

转载于:https://blog.51cto.com/teny32/1353706

终结TTS无图时代—Java原创巨作相关推荐

  1. UML类图、JAVA DesignMode 设计模式、设计原则

    全文2.6W余字,读完需要20分钟,介绍23种设计模式,每个模式都有案例与真实使用场景,能够帮助初学者快速了解设计模式,建立起对代码中设计模式的初步理解,要明确:设计模式只是帮助我们更好的设计代码架构 ...

  2. Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php

    Atitit.Cas机制 软件开发 编程语言 无锁机制 java c# php 1. 为什么需要无锁操作1 2. 硬件支持 cas  atomic2 3. 无锁编程(Lock-Free)就是在某些应用 ...

  3. java思维导图源代码_如何使用思维导图解读java开源项目

    思维导图与java 思维导图是个很神奇的工具,它具有结构化.可视化.更接近人类大脑认知的特点. 我们在阅读项目的时候往往是无头无脑的随便看源码,其实这是种错误的学习的方法.学习得多注重积累,有输入就要 ...

  4. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  5. ireport中文手册3.7版(无图)

    目录 Giulio Toffoli 1 1 序言... 6 什么是iReport?. 6 功能特点:... 7 iReport 社区:... 7 鸣谢:... 8 2 入门... 8 必要条件:... ...

  6. 大话设计模式之爱你一万年:第三章 创建型模式:工厂模式:我想让你坐在宝马里笑:2.工厂模式之无工厂时代

    在上一节中我们了解到了工厂模式中设计到了设计模式,在接下里的章节,我们会根据提出的问题一步步的优化我们的代码,最终把工厂模式学精学透. 一.工厂模式之无工厂时代 我有一个愿望就是让我的女朋友能够坐在宝 ...

  7. 直播回顾 | smardaten CPO俞亚君做客华为云新生态直播间,畅聊无码时代

    6月7日晚,smardaten CPO俞亚君做客华为云云市场「新生态直播」,生动讲述了「无码时代,软件开发如何走向每个人. smardaten-无码时代,软件开发如何走向每个人? 俞亚君拥有十年的大数 ...

  8. 织梦文章无图自动出图配图插件支持采集

    织梦文章无图自动出图配图插件的优点 1.提高文章的可读性和吸引力:插入图片可以丰富文章的内容和形式,增强读者的阅读体验和吸引力,提高文章的点击率和转化率. 2.节省时间和精力:手动添加图片需要花费大量 ...

  9. ​WWW 2023 | 无图协同过滤

    ©PaperWeekly 原创 · 作者 | 夏良昊 单位 | 香港大学 研究方向 | 推荐系统 论文题目: Graph-less Collaborative Filtering 收录会议: WWW ...

最新文章

  1. java 模块化_Java 9 新特性 - 模块化 - Java 技术驿站-Java 技术驿站
  2. spark on yarn 配置及异常解决
  3. 计算机网络选择重传,计算机网络选择重传协议实验报告..docx
  4. 【ES6(2015)】Symbol
  5. Xilinx FPGA PLL输出不能直接连接IO解决方法
  6. mysql 性能分析_十大MySQL性能分析工具汇总!专治MySQL性能瓶颈
  7. ZABBIX自动发现Redis端口并监控
  8. JavaScript 之 DOM中的三大对象
  9. java创建gitlab账户_GitLab不会创建新的存储库
  10. myBatis + SpringMVC上传、下载文件
  11. python 简单的接口测试框架
  12. (转)python3之模块io使用流的核心工具
  13. oracle多少条commit比较好,oracle什么时候须要commit
  14. 2022年网络规划设计师最新考纲变化
  15. 不同公式等号对齐_魔方的公式(第二版)
  16. 球面投影全景图快速拼接
  17. 以太网卡支持的工作模式
  18. 一份价值百万的大数据分析报告如何炼成?
  19. 堆、栈、队列的区别和联系
  20. hive hive beeline常用参数

热门文章

  1. 【Python】pipenv lock Read timed out
  2. 华为近场通讯nfc在哪里打开_华为手机nfc感应区在手机哪个位置?
  3. 名编辑电子杂志大师教程 | 如何把做好的电子杂志放到网站上?
  4. 【imessage苹果家庭推】最新版软件安装登录设备上的iMessages
  5. 游戏安全资讯精选 2018年第二期:游戏行业年度白皮书;手游外挂、直播答题安全风险解析,近30%外挂手游存在致命安全问题,八招应对短信验证码攻击...
  6. 什么是腾讯蓝鲸运维体系?附部署指南
  7. idea正则替换小技巧
  8. From System 1 Deep Learning to System 2 Deep Learning
  9. 【源代码:科技殿堂·PC】你一定没有见过这么 神奇的水滴
  10. bat拷贝与powershell拷贝