import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class CharWrittenInChar {
	public static void main(String[] args) {
		new CharWrittenInChar();
	}

	Scanner cin = new Scanner(System.in);
	char foreChar = '●', backChar = '○', writing = '福';
	BufferedImage pic;
	Font[] font;
	int from, to, cur;// 字体从哪里开始到哪里结束
	int width = 40, height;

	BufferedImage getPic() {
		Font f = new Font(font[cur].getName(), Font.BOLD, 150);
		BufferedImage bit = new BufferedImage(1000, 1000, BufferedImage.TYPE_3BYTE_BGR);
		Rectangle2D rec = bit.getGraphics().getFontMetrics(f).getStringBounds("" + writing, bit.getGraphics());
		bit = new BufferedImage((int) rec.getWidth() + 1, 1 + (int) rec.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
		Graphics gg = bit.getGraphics();
		gg.setColor(Color.black);
		gg.fillRect(0, 0, bit.getWidth(), bit.getHeight());
		gg.setFont(f);
		gg.setColor(Color.RED);
		gg.drawString("" + writing, 0, gg.getFontMetrics(f).getAscent());
		return bit;
	}

	void draw(BufferedImage bit, FileOutputStream file) throws IOException {
		height = bit.getHeight() * width / bit.getWidth();
		BufferedImage pic = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
		pic.getGraphics().drawImage(bit, 0, 0, width, height, null);
		String s = "\n\n\n" + font[cur].getName() + "------------\r\n\r\n";
		for (int j = 0; j < pic.getHeight(); j++) {
			for (int i = 0; i < pic.getWidth(); i++) {
				int k = pic.getRGB(i, j);
				if (k == -65536) {
					s += foreChar;
				} else {
					s += backChar;
				}
			}
			s += "\r\n";
		}
		cout(s);
		file.write(s.getBytes());
	}

	void output() {
		try {
			FileOutputStream file = new FileOutputStream(new File("result.txt"));
			for (cur = from; cur < to; cur++) {
				pic = getPic();
				draw(pic, file);
			}
			file.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	CharWrittenInChar() {
		GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
		font = e.getAllFonts();
		from = 0;
		to = 8;
		cur = 0;
		pic = getPic();
		output();
		run();
	}

	void run() {
		while (true) {
			cout("weidiao >");
			Scanner str = new Scanner(cin.nextLine());
			if (!str.hasNext()) {
				output();
				continue;
			}
			String cmd = str.next();
			if (cmd.equals("help")) {
				cout("Character Generater---made by weidiao.neu\n");
				cout("\t\tfore 前景字\n");
				cout("\t\tback 背景字\n");
				cout("\t\twriting 正在写\n");
				cout("\t\twidth 宽度\n");
				cout("\t\treset 重置全部字符及大小\n\n");
			} else if (cmd.equals("reset")) {
				foreChar = '●';
				backChar = '○';
				writing = '福';
				width = 40;
				output();
			} else {
				if (str.hasNext()) {
					switch (cmd) {
					case "fore":
						foreChar = str.next().charAt(0);
						output();
						break;
					case "back":
						backChar = str.next().charAt(0);
						output();
						break;
					case "writing":
						writing = str.next().charAt(0);
						output();
						break;
					case "width":
						width = new Integer(str.next());
						output();
						break;
					default:
						cout("illegal command\n");
					}
				} else {
					cout("illegal command\n");
				}
			}
			str.close();
		}
	}

	void cout(String s) {
		System.out.print(s);
	}
}

本程序用来"用字符写字符".给定一个字符,用很多个字符把这个字符拼起来.

原理是,把字符画在图片上(用Graphics.drawString函数),然后把这张图片画在一个固定大小的图片上.

现在,图片上只有两种颜色:前景色和背景色.

这就相当于一个二维矩阵,矩阵中有两种字符:前景字符和背景字符.

有三个东西可以进行设置:前景字符,背景字符,正在写的字符

java用字符写字符的更多相关文章

  1. java IO流 之 字符流

    字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...

  2. Java:IO流之字符流Reader、Writer详解

    java.io包中:字符流   字符流的两个抽象基类:   Reader         Writer   文件的读取:Reader抽象类(java.io包中) 直接子类的构造方法: FileRead ...

  3. java中字节流和字符流的区别

    流分类: 1.Java的字节流   InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先.2.Java的字符流  Reader是所有读取字符串输入流的祖先,而 ...

  4. java把html标签字符转普通字符(反转换成html标签)(摘抄)

    下面是java把html标签字符转换,我用了spring 包中的 org.springframework.web.util.HtmlUtils 了解了源代码并且进步了使用,发现写得真不错...同时也可 ...

  5. 【Java基础】【21IO(字符流)&字符流其他内容&递归】

    21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写 ...

  6. JAVA是是如何处理字符的。

    String s = "fs123fdsa";//String变量 byte b[] = s.getBytes();//String转换为byte[] String t = new ...

  7. 缓冲字符流 java.io.BufferedWriter ,java.io.BufferedReader,缓冲字符输出流:PrintWriter

    package seday07; import java.io.IOException;import java.io.PrintWriter; /*** @author xingsir * 缓冲字符流 ...

  8. Java IO---字节流和字符流

    一.IO流简介 流 流是一个抽象概念,Java程序和外部设备(可以是硬盘上的文件,也可以是网络设备)之间的输入输出操作是基于流的. 流就好比水管中的水流,具有流入和流出,类比数据的输入和输出. Jav ...

  9. Java IO: 字节和字符数组

    原文链接  作者: Jakob Jenkov   译者:homesick 内容列表 从InputStream或者Reader中读入数组 从OutputStream或者Writer中写数组 在java中 ...

随机推荐

  1. x01.os.13: 文件系统

    停了两天电,忽然得空闲.找来破吉他,已然不成弦.           丁丁当当敲,敲到电来到.为把时间捡,熬夜三四点. 从我的置顶随笔 x01.Lab.Download 中下载 x01.os.12.t ...

  2. linux 分区 物理卷 逻辑卷

    今天我们主要说说分区.格式化.SWAP.LVM.软件RAID的创建哈~ 格式化 查看当前分区:fdisk   -l 这个命令我们以前是讲过的,我现在问下,ID那项是什么意思? 83 是代表EXT2和E ...

  3. Android中设置TextView的颜色setTextColor

    tv.setTextColor(Color.parseColor("#FFFFFF")); tv.setTextColor(Color.WHITE); tv.setTextColo ...

  4. 在JazzyViewPager中调用其它layout布局xml并使用

    开源地址:https://github.com/jfeinstein10/JazzyViewPager 发现网上的例子使用的是直接创建的一个TextView来做的.但是实际上使用,不可能只有这一个控件 ...

  5. AC日记——加密的病历单 openjudge 1.7 12

    12:加密的病历单 总时间限制:  1000ms 内存限制:  65536kB 描述 小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会. 在药房实习期间,小英扎实的专业基础获得了医生的一致 ...

  6. S2结业考试的第一次测验

    错题分析: 1:java中的错误处理是通过异常处理模型来实现的,那么异常处理模块能处理的错误是: A:运行时错误 B:逻辑错误 C:语法错误 D:内部错误 正确答案是:A 解析:运行时异常都是Runt ...

  7. Java之反射机制

    一:基本概念:在Java运行时,对于任意一个类,能否知道这个类对应的属性和方法?对于一个对象,能否知道可以调用它的哪些方法?YES! 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言 ...

  8. memcached的图形界面监控

    前提是已经安装了php和memcached   图形界面的监控是通过memcache.php来实现的,   1.把该php程序拷贝到apache的web根目录   [root@cacti srv]# ...

  9. JVM监测&工具[转]

    通过工具及Java api来监测JVM的运行状态, 需要监测的数据:(内存使用情况 谁使用了内存 GC的状况) 内存使用情况--heap&PermGen @ 表示通过jmap –heap pi ...

  10. PHP代码20个实用技巧(转)

    这些技巧特别是封装的,相对路径的还是挺好的,本身来自微信公众号,但是我担心以后删除,所以在我的博客上备份一下(微信公众号为:菜鸟教程) 在这篇文章中我们将看看一些关于PHP开发有用的提示和技巧,可以用 ...