字符面積
一個字符所需要覆蓋的區域,比如
#
和~
比較,很明顯,#
所佔的區域大一點。
代碼實現
package test;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import javax.imageio.ImageIO;
/**
* @author F-zx
* 計算出每個字符需要佔用的面積,用來表示每一個像素點需要用的字符,//取ASCII碼的33----125 92個
* 取沒個字符的size爲FONT_SIZE,所以這個圖片的width爲FONT_SIZE*92
*/
public class CalculateCharArea {
/**
* @author F-zx
* 對compareable實現,目的在於對該類進行排序,按照pixNum排序,其實可以不用排序,這裏只是想複習一個該接口的實現
*/
private static class CharArea implements Comparable<CharArea>{
public int pixNum ;//該字符所有的有色點的個數
public char c;//該字符
public CharArea(int pixNum , char c) {
this.c = c;
this.pixNum = pixNum;
}
@Override
public int compareTo(CharArea o) {
if(o.pixNum <= this.pixNum)
return 1;
else
return -1;
}
}
private final static int NUM = 92;
private final static int HEIGHT = 50;
private final static int FONT_SIZE = 50;
private final static int WIDTH = FONT_SIZE * NUM ;
private static StringBuffer buffer = null;
private static File file = null;
private static BufferedImage bImage = null;
private static CharArea[] chars = new CharArea[NUM];
/**
* 建立一個字符的序列
* @return
*/
private static String build(){
buffer = new StringBuffer();
//取ASCII碼的33----125 92個
for(int i = 33 ; i < 125 ; i++)
buffer.append((char)i);
return buffer.toString();
}
/**
* 繪製出相應的圖片
*/
private static void paint(){
file = new File("e://resources/char.jpg");
bImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_BYTE_BINARY);
Font font = new Font(null, Font.PLAIN, FONT_SIZE);
Graphics2D g = bImage.createGraphics();
g.setBackground(Color.white);
g.setColor(Color.black);
g.setFont(font);
g.clearRect(0, 0, WIDTH, HEIGHT);
String strs = build();
char[] c = strs.toCharArray();
int i = 0 ;
for (char d : c) {
g.drawString(""+d, FONT_SIZE * ( i++ ), 40);
}
g.dispose();
try {
ImageIO.write(bImage, "jpg", file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("ok");
}
/**
* 計算出沒個的面積,然後排序一下,這裏計算沒個區域(size*size)的大小,在其中尋找有色點的個數,然後對這些進行排序,引入一個數據結構,
* ps:對於每個點,-1表示該點爲白色
* @throws IOException
*/
private static void calculate() throws IOException{
if(file == null)
file = new File("e://resources/char.jpg");
if(bImage == null)
bImage = ImageIO.read(file);
int count = 0;//每個字符的有色點個數
for(int j = 1 ; j <= NUM ; j ++){ //個數循環
count = 0;
chars[j-1] = new CharArea( 0 , (char) (j+32) ); //因爲字符是從33開始的,所以j+32對應的是33的起始位置
for(int k = (j-1)*50 ; k < 50*j ; k++){ //沒個字符的寬度循環
for(int m = 0 ; m < 50 ; m++ ){ //每個字符的高度循環
int rgb = bImage.getRGB(k, m);
count += (rgb != -1) ? 1: 0;
// System.out.println(rgb); //測試點的顏色輸出
}
}
chars[j-1].pixNum = count;
}
}
public static void main(String[] args) throws IOException {
paint();
calculate();
// for (CharArea area : chars) {
// System.out.println(area.c+" "+area.pixNum);
// }
Arrays.sort(chars);
for (CharArea area : chars) {
System.out.println(area.c+" "+area.pixNum);
}
}
}
詳情請看代碼註釋
輸出結果
ok
. 16
, 32
: 32
` 32
' 46
; 48
- 56
" 92
! 108
_ 112
* 122
i 128
^ 142
l 144
r 145
/ 148
\ 148
< 158
> 158
j 166
( 170
) 170
+ 176
t 177
I 180
= 184
| 184
1 185
f 201
v 203
7 215
{ 218
? 221
[ 224
] 224
x 232
c 239
L 248
J 249
u 257
n 261
y 262
z 265
T 276
s 281
k 284
o 284
h 302
Y 308
4 317
2 319
3 320
F 320
e 327
5 331
a 344
p 344
0 345
q 345
b 347
d 347
w 364
C 367
9 373
6 379
V 379
P 385
Z 390
m 391
A 392
U 399
8 400
X 400
g 409
E 420
& 429
S 429
H 432
$ 435
K 437
# 445
O 456
D 466
% 468
G 469
R 491
Q 492
B 510
N 526
W 606
M 653
@ 844
後續
接下來需要做的就是將這些信息對應256個色階分配下去,然後繪製出相應的字符圖像。