`
bogongjie
  • 浏览: 235437 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

android 点阵字库

阅读更多

1.点阵字库

 

       点阵字库是把每一个汉字都分成16×16或24×24个点,然后用每个点的虚实来表示汉字的轮廓,常用来作为显示字库使用,这类点阵字库汉字最大的缺点是不能放大,一旦放大后就会发现文字边缘的锯齿。 

矢量字库保存的是对每一个汉字的描述信息,比如一个笔划的起始、终止坐标,半径、弧度等等。在显示、打印这一类字库时,要经过一系列的数学运算才能输出结果,但是这一类字库保存的汉字理论上可以被无限地放大,笔划轮廓仍然能保持圆滑,打印时使用的字库均为此类字库.

2.点阵字库结构

      在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0代表没有,1代表有点,将0和1分别用不同颜色画出,就形成了一个汉字,常用的点阵矩阵有12*12, 14*14, 16*16三种字库。  字库根据字节所表示点的不同有分为横向矩阵和纵向矩阵,目前多数的字库都是横向矩阵的存储方式(用得最多的应该是早期UCDOS字库),纵向矩阵一般是因为有某些液晶是采用纵向扫描显示法,为了提高显示速度,于是便把字库矩阵做成纵向,省得在显示时还要做矩阵转换。我们接下去所描述的都是指横向矩阵字库。

       对于16*16的矩阵来说,它所需要的位数共是16*16=256个位,每个字节为8位,因此,每个汉字都需要用256/8=32个字节来表示。  即每两个字节代表一行的16个点,共需要16行,显示汉字时,只需一次性读取32个字节,并将每两个字节为一行打印出来,即可形成一个汉字.

16*16:

public class Font16 {
	private Context context;

	public Font16(Context context) {
		this.context = context;
	}

	private final static String ENCODE = "GB2312";
	private final static String ZK16 = "HZK16";

	private boolean[][] arr;
	int all_16_32 = 16;
	int all_2_4 = 2;
	int all_32_128 = 32;

	public boolean[][] drawString(String str) {
		byte[] data = null;
		int[] code = null;
		int byteCount;
		int lCount;

		arr = new boolean[all_16_32][all_16_32];
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) < 0x80) {
				continue;
			}
			code = getByteCode(str.substring(i, i + 1));
			data = read(code[0], code[1]);
			byteCount = 0;
			for (int line = 0; line < all_16_32; line++) {
				lCount = 0;
				for (int k = 0; k < all_2_4; k++) {
					for (int j = 0; j < 8; j++) {
						if (((data[byteCount] >> (7 - j)) & 0x1) == 1) {
							arr[line][lCount] = true;
							System.out.print("@");
						} else {
							System.out.print(" ");
							arr[line][lCount] = false;
						}
						lCount++;
					}
					byteCount++;
				}
				System.out.println();
			}
		}
		return arr;
	}

	protected byte[] read(int areaCode, int posCode) {
		byte[] data = null;
		try {
			int area = areaCode - 0xa0;
			int pos = posCode - 0xa0;

			InputStream in = context.getResources().getAssets().open(ZK16);
			long offset = all_32_128 * ((area - 1) * 94 + pos - 1);
			in.skip(offset);
			data = new byte[all_32_128];
			in.read(data, 0, all_32_128);
			in.close();
		} catch (Exception ex) {
		}
		return data;
	}

	protected int[] getByteCode(String str) {
		int[] byteCode = new int[2];
		try {
			byte[] data = str.getBytes(ENCODE);
			byteCode[0] = data[0] < 0 ? 256 + data[0] : data[0];
			byteCode[1] = data[1] < 0 ? 256 + data[1] : data[1];
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return byteCode;
	}

}

 自定义SurfaceView:

public class MySurfaceView extends SurfaceView {
	private Context mContext;
	private SurfaceHolder holder;

	public MySurfaceView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		this.mContext = context;
		holder = this.getHolder();
	}

	public MySurfaceView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		this.mContext = context;
		holder = this.getHolder();
	}

	public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		// TODO Auto-generated constructor stub
		this.mContext = context;
		holder = this.getHolder();
	}

	/**
	 * show font
	 * 
	 * @param font_kind
	 *            the font type, has 16,24,32
	 * @param font
	 *            draw font
	 * @param startx
	 *            the font coordinate start x value
	 * @param starty
	 *            the font coordinate start y value
	 * @param beishu
	 *            the font magnification multiple
	 * @param type
	 *            draw font use icon,1 is flower,2 is love
	 */

	public void show_font16(int font_kind, String font, int startx, int starty, int beishu, int type) {
		boolean[][] arr = null;
		int weith = 16;
		int height = 16;
		if (font_kind == 16) {
			weith = 16;
			height = 16;
			arr = new boolean[weith][height];
			Font16 font16 = new Font16(mContext);
			arr = font16.drawString(font);
		} else if (font_kind == 24) {
			weith = 24;
			height = 24;
			arr = new boolean[weith][height];
			Font24 font24 = new Font24(mContext);
			arr = font24.drawString(font);
		} else {
			weith = 32;
			height = 32;
			arr = new boolean[weith][height];
			Font32 font32 = new Font32(mContext);
			arr = font32.drawString(font);
		}

		for (int i = 0; i < weith; i++) {
			for (int j = 0; j < height; j++) {
				try {
					Thread.sleep(25);
				} catch (InterruptedException e1) {
					// TODO 自动生成的 catch 块
					e1.printStackTrace();
				}
				float x = (float) j;
				float y = (float) i;
				if (arr[i][j]) {
					Bitmap bitmap = null;
					if (type == 1) {
						bitmap = BitmapFactory.decodeStream(mContext.getResources().openRawResource(R.drawable.hua));
					} else if (type == 2) {
						bitmap = BitmapFactory.decodeStream(mContext.getResources().openRawResource(R.drawable.love));
					}
					int bw = bitmap.getWidth();
					int bh = bitmap.getHeight();
					synchronized (holder) {
						Canvas c = null;
						try {
							c = holder.lockCanvas(new Rect(startx + (int) x * beishu, starty + (int) y * beishu, startx + (int) x * beishu
									+ bw, starty + (int) y * beishu + bh));

							Paint p = new Paint();
							p.setColor(Color.RED);
							c.drawBitmap(bitmap, startx + x * beishu, starty + y * beishu, p);

						} catch (Exception e) {
							e.printStackTrace();
						} finally {
							try {
								if (c != null) {
									holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。
								}
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					}
				}
			}

		}

	}

}

 

 

分享到:
评论

相关推荐

    点阵字库16和16附加调用代码逻辑.rar

    点阵字库是一种将汉字或其他字符以点的形式存储的字库,主要用于低分辨率显示设备或嵌入式系统中。在本资源"点阵字库16和16附加调用代码逻辑.rar"中,主要包含了一个HZK16点阵字库以及相关的Java调用逻辑,适用于16*...

    29种Android字库ttf文件

    TrueType Font(TTF)是一种点阵字体格式,广泛应用于各种操作系统,包括Android。Android系统支持TTF格式的字体文件,允许开发者自定义应用中的文字样式。TTF文件包含了字符形状的描述,这些描述可以被渲染引擎用来...

    点阵方式显示系统时间

    点阵字库是由一系列点(或称为像素)组成的字符图形,每个点代表一个像素,通过点的亮灭组合形成字符。例如,一个8x8的点阵可以表示一个简单的字符,其中8表示列数,8表示行数,一共64个点。点阵字库通常用于低...

    AndLattice:安卓下利用window下点阵字库生成LED设备显示的数据包,实现模拟的LED控制进行预览

    AndLattice是一个专为安卓系统设计的工具,其主要功能是利用Windows系统的点阵字库来生成LED显示设备所需的数据包,进而实现对LED设备的模拟控制和预览。这个项目的核心在于将复杂的LED显示逻辑转化为用户友好的安卓...

    Android软件与下位机打印机通讯

    不同类型的打印机可能支持不同的打印指令集,例如ESC/POS指令集,这是一种常见的用于点阵式打印机的命令语言,可以控制打印、字体、条形码、二维码等多种功能。开发者需要将Android应用中的数据转换为打印机能理解的...

    Python print 玩转点阵字

    在汉字点阵字中,每个汉字会被转换成16x16或更小的矩阵,这样的格式叫做HZK16,即16行16列的点阵字库。 在Python中实现点阵字的打印,我们可以利用字符串的重复和格式化技巧。例如,我们可以创建一个二维列表来存储...

    JAVA汉字字库及字模提取程序实现

    在本文中,我们选择了HZK16作为汉字字库,该字库是一个符合GB2312标准的16×16点阵字库,包含6763个汉字和682个符号。HZK16字库是二进制文件,难以打开,但Java提供了FileInputStream类来读取二进制文件。 第二步:...

    LED16*16字库

    led16*16字库。。

    无版权的矢量字库 google手机采用的

    矢量字库是一种字体设计方式,它以数学公式和路径数据来表示文字,而非像素点阵。这样的设计使得矢量字体在任何尺寸下都能保持清晰、锐利,不会出现像素化的问题,尤其适用于高分辨率屏幕和需要放大显示的场景。在IT...

    重庆市计算机一级2013真题.pdf

    6. **点阵字库**:24*24点阵字库,每个汉字占用3*24=72个字节存储空间。 7. **计算机软件**:包含程序和文档资料。 8. **计算机体系结构**:程序存储和程序控制的概念由冯·诺依曼提出。 9. **控制器功能**:负责...

    MotorolaScreentype

    在Android系统中,手机制造商常常会为自己的设备定制专属的字体,以体现品牌特色和提升用户体验。MotorolaScreentype就是摩托罗拉对这种定制化字体的体现。 在移动设备上,字体的选择和优化至关重要,因为它直接...

    (完整word版)重庆2017专升本计算机应有试题.doc

    1. 字库容量计算:24*24点阵的汉字字形库存储容量计算。每个点阵代表一个像素,黑白两色,所以一个点可以用1位来表示,24*24点阵就是24*24/8=72字节,因此一个汉字的字形库存储容量是72个字节。 2. 浏览器快捷键:...

    JAVA熱敏打印POS

    Java程序可以使用嵌入式字库或者下载字模数据,将汉字转换为打印机可识别的点阵数据。 5. **打印服务类**:创建一个Java类,封装打印机的初始化、发送数据、关闭连接等操作,提供统一的接口供其他业务逻辑调用。 6...

Global site tag (gtag.js) - Google Analytics