- <?php
- $xml=simplexml_load_file("zimu.xml");//导入XML文件,从XML文件里知道需要提取的字体的信息
- $font_height=$xml->font->Size_H; //字体高
- $font_width=$xml->font->Size_L;//字体宽
- $lcdwidth=($xml->num_weight)*16;//屏幕的宽度
- $lcdheight=($xml->num_height)*32;//屏幕高度
- $Size=$font_width.$font_height; //字体的大小
- $ZiMu=$xml->character; //字内容
- $show=$xml->enter; //文字出现的效果
- $B=$xml->font->B;
- $U=$xml->font->U;
- $display=$B.$U; //是否选择加粗和下划线
- $str=mb_convert_encoding($ZiMu,"gbk","utf-8"); //把输入的字转换为GBK编码
- $strlen=strlen($str); //一个字两个字节,字节数
- if($font_height*$font_width==12*12){$font_height=16;} //因为一次扫描八位,所以要八的整数
- switch($display)//打开字库的类型
- {
- case "":$file_name="HZK/cell.bin";break; //没有加下划线和加粗功能的字库
- case "B":$file_name="HZK/B-cell.bin";break;//加粗功能的字库
- case "U":$file_name="HZK/U-cell.bin";break;//加下划线功能的字库
- case "BU":$file_name="HZK/B-U-cell.bin";break;//加下划线和加粗功能的字库
- }
- switch($Size)//不同字体大小偏移量
- {
- case 1212:$start_offset=0;break; //字的大小为12*12
- case 1216:$start_offset=0x0002FEB2;break; //字的大小为12*16
- case 1616:$start_offset=0x0005FD64;break; //字的大小为16*16
- case 1624:$start_offset=0x0009FBA6;break; //字的大小为16*24
- case 2424:$start_offset=0x000FF908;break; //字的大小为24*24
- case 2432:$start_offset=0x0018F51A;break; //字的大小为24*32
- case 3232:$start_offset=0x0024EFDC;break; //字的大小为32*32
- }
- $fp = fopen($file_name, "rb");//打开字库文件
- $offset_size=$font_width * $font_height / 8; //不同字体大小的一个字需要的字节数,一个字节有8位
- $number="";
- $word_number=(int)($lcdwidth/$font_width);//一行能放多少字
- $word_string=$word_number*2;//一行能放的字节数,一个汉字两个字节
- $circulation=0; //要循环的次数即要放多少字在一行里
- $_rows=0; //要放在第几行
- for ($i=0; $i<$strlen;$i++)//走一次提取一个字的二进制数
- {
- $dot_string="";
- if (ord($str[$i])>127) //汉字
- {
- $offset=(((ord($str[$i])-0xa1)*94)+(ord($str[$i+1])-0xa1))*$offset_size; //汉字偏移量的计算公式
- $i++; //因为汉字是两个字节,所以i加两次
- }
- else //英文,标点符号
- { $offset=(ord($str[$i])+155)*$offset_size; }//英文偏移量的计算公式
- fseek($fp, $start_offset+$offset,SEEK_SET);//把指针指到要取得字的位置
- $bindot=fread($fp, $offset_size); //提取的字
- for($j=0; $j<$offset_size; $j++) //一次转换一个字节,把一个字转换为二进制数字
- { $dot_string.= sprintf("%08b", ord($bindot[$j]));
- $total.=sprintf("%08b", ord($bindot[$j])); }
- $one_word[$i]=$dot_string; //一个字的字节
- $number.=$one_word[$i];//一行所放的字
- $circulation++;//循环的次数即一行放的字数
- if($circulation==$word_number)//当一行放满,就重新开始放下一行
- {
- $circulation=0;
- $_rows++;
- $Word[$_rows-1]=$number;
- $number="";
- }
- }
- $Word[$_rows]=$number; //不满一行的字放在这里
- $lcdrow=json_encode($Word);//PHP转JSON
- $row_number=(count($one_word))/$word_number; //需要多少行,总数处于一行的数
- fclose($fp); //关闭字库文件
- ?>