/*
* 1、这个一个Java程序,感谢您花费大量时间阅读本文档;
* 2、本人知道大家并不喜欢看大量文字描述,但实属无奈,因为我们的沟通只能通过文字;
* 3、当您在复制、粘贴的时候请注意包名为:practice,文件名为:CharMaps,以防止一些不必要的麻烦;
* 4、下面这张由字符组成的图是直接由图片生成的,信与不信由您决定,另外可以肯定的是本人绝对不会一个字一个敲这幅图;
* 5、如果想知道她是如何完成的,请看完CharMaps类前面的全部注释,因为她是工具,有些内容需要了解、素材需要准备;
* 6、本次注释参考了MyEclipse的注释风格,相对比上次来说注释要规范一些,但由于本人经验、认知水平有限,可能很多地方没有
* 考虑完全,或者没有解释清楚,请谅解。
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢一一一一虢虢虢虢一一一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一一一虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢一一一虢虢虢一一虢一虢一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一一一一一一一一虢虢虢虢虢虢虢虢
虢虢虢虢虢虢一虢一虢虢虢一一一一一一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢一一一一一虢虢虢虢一一一一一虢虢虢虢虢虢
虢虢虢虢虢一一虢虢虢虢虢一一虢虢虢一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢
虢虢虢虢虢一虢虢虢虢虢虢虢一一一一一虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢一一一虢虢虢虢一一一一虢虢虢虢一一一虢虢虢虢
虢虢虢虢一一虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢一一一一一一一一虢虢虢一一一虢虢虢
虢虢虢虢一一一虢虢虢虢虢一一一一一一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一虢虢虢一一一一一一一一一一一虢虢一一虢虢虢
虢虢虢虢一虢一一虢虢虢一一虢一一一虢一虢虢虢虢一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一虢虢虢一一一一虢虢虢虢一一一一虢虢虢一一虢虢
虢虢虢虢一虢虢一一虢一一虢虢一一一虢一一虢虢虢一虢虢虢虢虢一一一虢虢一一一一一虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢一一一一虢虢虢虢虢虢一一一一虢虢一一虢虢
虢虢虢一一虢虢虢一一一虢虢虢一一一虢虢一一虢一一虢虢虢虢虢一一一虢一一一一一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢一一一虢虢虢一一虢虢虢一一一虢虢一一虢虢
虢虢虢一虢虢虢虢虢虢虢虢一一一一一虢虢虢一一一虢虢虢虢虢虢一一一一一虢虢虢虢一一一虢虢虢虢虢虢一一一虢虢虢虢虢一一虢虢一一一虢虢虢一一一一虢虢虢一一一虢虢一一虢
虢虢一一虢虢虢虢虢虢虢虢一一一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一一虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢一一虢虢一一一虢虢一一虢虢一一虢虢一一一虢虢一一虢
虢虢一虢虢虢虢虢虢虢虢虢一虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢一一虢虢一一一虢虢一一虢虢一一虢虢一一一虢虢一一虢
虢虢一虢虢虢虢虢虢虢虢虢一虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢一一虢虢一一一虢虢虢一一一一虢虢虢一一一虢虢一一虢
虢虢一虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢一一一虢虢虢一一虢虢虢一一一虢虢一一虢虢
虢一一虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢一一一一虢虢虢虢虢虢一一一一虢虢一一虢虢
虢一虢虢虢虢虢虢虢虢虢虢一一一虢一一虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢一一虢虢虢一一一一虢虢虢虢一一一一虢虢虢一一虢虢
虢一虢虢一虢虢虢虢虢虢虢一虢虢虢虢一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢一一虢虢一一一一一一一一一一一虢虢虢一一虢虢虢
虢虢虢虢一一虢虢虢虢虢一一虢虢虢虢虢一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢一一一一一一一一虢虢虢一一一虢虢虢
虢虢虢虢虢一一虢虢虢一一虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢一一一虢虢虢虢一一一一虢虢虢虢一一一虢虢虢虢
虢虢虢虢虢虢一一虢虢一虢虢虢虢虢虢虢一一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢
虢虢虢虢虢虢虢一一一一虢虢虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢一一一一一虢虢虢虢一一一一一虢虢虢虢虢虢
虢虢虢虢虢虢虢虢一一虢虢虢虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢一一一一一一一一一一虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢一一一虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一一虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢一一一虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢
虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢虢
*/
package practice;
import java.awt.image.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.imageio.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;
/**
*       
* 在很多时候,我们在转换成为字符的时候,上、下、左、右总有我们那些我们不需要的一些行,这行不
*是我们自己需要的,我们还让软件帮我们处理掉吧,默认赋值有那么点讲究,您应该能看懂的,其实跟后面
*的判断取值有关,初始化值是根据小的取大值,大的取小值的方式,您自己可以看着取。
*
*/
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 imageWidth = 0;
static int imageHeight = 0;
/**
*        
* 在多张图片处理时候,每张图片处理使用不同的字符区别,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>
*        
* 如果有效的图形区域小于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 < imageHeight; i++) {
for (int j = 0; j < imageWidth; j++) {
int rgb = bufferedImage.getRGB(j, i);
if ((rgb&0xff)<128 ) {
charMaps[charMaps.length/2-imageHeight/2+i][charMaps[0].length/2-imageWidth/2+j] = charSelects[charSelectindex];
boundedRangeOfImage(i,j);
}
}
}
}
/**
* 图片边界范围检查函数,完成任务如下:<br>
*        
* 主要是完成检查当前点是否是图片的有效边缘,对图片上、下、左、右有效区域进行查找,为后面保存时裁剪作准备。<br>
* @param i 当前点的行号
* @param j 当前点的列号
*/
private static void boundedRangeOfImage(int i, int j) {
//记录图形中最上面开始出现图形行号
if (charMaps.length/2-imageHeight/2+i<firstOfUpRow) {
firstOfUpRow = charMaps.length/2-imageHeight/2+i;
}
//记录图形中最下面开始不再出现图形行号
if (charMaps.length/2-imageHeight/2+i>lastOfUpRow) {
lastOfUpRow = charMaps.length/2-imageHeight/2+i;
}
//记录图形中一行里面开始出现图形列号
if (charMaps[0].length/2-imageWidth/2+j<firstOfCol) {
firstOfCol = charMaps[0].length/2-imageWidth/2+j;
}
//记录图形中一行里面开始不再出现图形列号
if (charMaps[0].length/2-imageWidth/2+j>lastOfCol) {
lastOfCol = charMaps[0].length/2-imageWidth/2+j;
}
}
/**
* 图片尺寸检查函数,完成任务如下:<br>
*        
* 主要是完成对图片的尺寸进行检查,不要比默认设置或者自己定制的charMaps数组大。<br>
*/
private static void ImageSizeCheck(File filePath) throws IOException {
bufferedImage = ImageIO.read(filePath);
//得到图片的长宽
imageWidth = bufferedImage.getWidth();
imageHeight = bufferedImage.getHeight();
if ((charMapsRow < imageHeight) || (charMapsCol < imageWidth)) {
System.out.println("图片宽因该小于2000,高小于1000");
return ;
}
}
/**
* 文件后缀检查函数,完成任务如下:<br>
*        
* 采用正则表达式对文件进行匹配。<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>
*        
* 完成对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("完成文件选择初始化");
}
}
相关推荐
总结来说,ArcGIS制图技术是一个综合的技术体系,它不仅涵盖了地图的制作、展示和输出,还包括了符号库的管理、图层叠加、符号渲染以及高级渲染技术等多个方面。通过对这些技术的掌握,制图人员可以制作出既美观又...
总结来说,CAD机械制图综合制图的步骤主要包括:创建绘图文件和设置绘图环境、绘制基本和复杂图形、进行尺寸标注和注释、图层和块的应用管理以及图纸的最终输出。在整个制图过程中,设计师需遵循相应的绘图标准和...
2. **综合布线系统工程设计**:进行现场勘察和需求分析,绘制网络拓扑结构图、布线拓扑图和平面信息点分布图,熟悉相关设计标准和应用绘图软件。 3. **工作区子系统施工**:学习底座和双绞线的敷设与端接技术,掌握...
本文就基于CAD绘图技术的工程制图教学改革进行了探讨,分析了CAD技术在教学中的应用和效果。 首先,文章指出了传统工程制图教学的局限性。传统的教学模式主要以手工绘制二维图纸为主,这种方式要求学生具有很强的...
随着计算机科学和信息技术的发展,地图制图技术不再局限于传统的手工绘图,而是扩展为包含大量数据处理、分析和可视化等复杂技术的综合体系。 数字地图制图的理论基础主要包括以下几个方面: 信息理论:信息理论在...
CAD绘图技术是一种计算机辅助设计技术,它在机械制图的领域中发挥着重要的作用,特别是在机械制图案例教学中,CAD绘图技术的应用不仅能够提高教学质量,还能够激发学生的学习兴趣,提高他们的学习积极性。...
《技术与遥感图像数字分析方法解译制图及其综合应用实务全书》是一本深入探讨遥感技术在数字分析、图像解译和制图领域中的应用的专业书籍。该书全面覆盖了遥感领域的核心概念、理论和技术,旨在为读者提供一套完整且...
本文件为《2021年全国职业院校技能大赛数控综合应用技术赛项规程》,它详细说明了2021年数控综合应用技术赛项的相关规程,为参赛选手提供了备赛时的参照。本文将对规程中提到的知识点进行详细解析。 首先,规程明确...
网络综合布线是信息技术基础设施的重要组成部分,它涉及到了建筑物或园区内部的数据和语音通信系统。在进行网络综合布线时,通常需要进行详尽的规划、设计和实施,以确保系统的高效、稳定与可扩展性。CAD(Computer-...
综合管线测量技术方案涉及到多个领域的专业知识,包括但不限于测量技术、地理信息系统(GIS)、全球定位系统(GPS)、以及其他相关的标准和规范。为了深入解析这些知识,以下将对提供的部分内容进行详细的阐述。 ...
《机械制图与计算机绘图》教学大纲 1 《电工学》教学大纲 5 《电子技术》教学大纲 8 《工程力学》教学大纲 12 《公差配合与技术测量》课程教学大纲 16 《机械设计基础》教学大纲 20 《液压与气压传动》教学大纲 26 ...
技术制图-投影法pdf,技术制图-投影法
他们采用等大编绘技术,对光栅图像进行综合概括,特别关注主流和重点河流的表示,同时对点图元参数进行调整。 实习六:流水侵蚀地貌制图综合 这部分实习让学生初步掌握了地貌综合的基本原则和技巧。通过作业,学生...
在综合管理中,CAD技术能够实现各结构与位置的相互交叉,对煤矿整体设计和生产具有重要的借鉴和指导意义。这不仅有助于提升煤矿的安全生产,还能够提高现场管理效率。 在矿图绘制方面,CAD技术的应用使得图层和字体...
课程内容包括增加工程识图、施工图绘制、混凝土结构施工图绘制等内容,注重实际应用,提高了学生的综合绘图能力。课程还结合全国职业院校技能大赛,将大赛元素和规则整合到教学中,激发学生学习热情,提高动手能力。...
CAD技术与机械制图课程的融合,需要在内容、学时分配以及学习方法等多个层面进行综合考量。在内容方面,通过将CAD技术融入到机械制图课程中,可以使学生在理论知识和实践能力方面获得均衡发展。在学时分配方面,将...