java實現圖片轉化爲字符圖片--統計字符所佔的面積

字符面積

一個字符所需要覆蓋的區域,比如#~比較,很明顯,#所佔的區域大一點。

代碼實現

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個色階分配下去,然後繪製出相應的字符圖像。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章