PHP仿LED点阵,读取字库文字,并转化为二进制输出

  1. <?php   
  2.    
  3. $xml=simplexml_load_file("zimu.xml");//导入XML文件,从XML文件里知道需要提取的字体的信息  
  4. $font_height=$xml->font->Size_H; //字体高  
  5. $font_width=$xml->font->Size_L;//字体宽  
  6. $lcdwidth=($xml->num_weight)*16;//屏幕的宽度  
  7. $lcdheight=($xml->num_height)*32;//屏幕高度  
  8. $Size=$font_width.$font_height; //字体的大小  
  9. $ZiMu=$xml->character;   //字内容  
  10. $show=$xml->enter;       //文字出现的效果  
  11. $B=$xml->font->B;       
  12. $U=$xml->font->U;  
  13. $display=$B.$U;        //是否选择加粗和下划线  
  14. $str=mb_convert_encoding($ZiMu,"gbk","utf-8"); //把输入的字转换为GBK编码  
  15. $strlen=strlen($str);  //一个字两个字节,字节数  
  16.   
  17.   
  18. if($font_height*$font_width==12*12){$font_height=16;}  //因为一次扫描八位,所以要八的整数  
  19. switch($display)//打开字库的类型  
  20.   {  
  21.     case "":$file_name="HZK/cell.bin";break;  //没有加下划线和加粗功能的字库  
  22.     case "B":$file_name="HZK/B-cell.bin";break;//加粗功能的字库  
  23.     case "U":$file_name="HZK/U-cell.bin";break;//加下划线功能的字库  
  24.     case "BU":$file_name="HZK/B-U-cell.bin";break;//加下划线和加粗功能的字库  
  25.   }  
  26. switch($Size)//不同字体大小偏移量  
  27.   {  
  28.     case 1212:$start_offset=0;break;    //字的大小为12*12  
  29.     case 1216:$start_offset=0x0002FEB2;break;  //字的大小为12*16  
  30.     case 1616:$start_offset=0x0005FD64;break;  //字的大小为16*16  
  31.     case 1624:$start_offset=0x0009FBA6;break;  //字的大小为16*24  
  32.     case 2424:$start_offset=0x000FF908;break;  //字的大小为24*24  
  33.     case 2432:$start_offset=0x0018F51A;break;  //字的大小为24*32  
  34.     case 3232:$start_offset=0x0024EFDC;break;  //字的大小为32*32  
  35.   }  
  36.   
  37.   
  38. $fp = fopen($file_name, "rb");//打开字库文件  
  39. $offset_size=$font_width * $font_height / 8;  //不同字体大小的一个字需要的字节数,一个字节有8位  
  40. $number="";  
  41. $word_number=(int)($lcdwidth/$font_width);//一行能放多少字  
  42. $word_string=$word_number*2;//一行能放的字节数,一个汉字两个字节  
  43. $circulation=0; //要循环的次数即要放多少字在一行里  
  44. $_rows=0; //要放在第几行  
  45. for ($i=0; $i<$strlen;$i++)//走一次提取一个字的二进制数  
  46. {   
  47.     $dot_string="";  
  48.     if (ord($str[$i])>127) //汉字  
  49.       {     
  50.       $offset=(((ord($str[$i])-0xa1)*94)+(ord($str[$i+1])-0xa1))*$offset_size; //汉字偏移量的计算公式  
  51.         $i++; //因为汉字是两个字节,所以i加两次  
  52.       }  
  53.     else  //英文,标点符号  
  54.      {  $offset=(ord($str[$i])+155)*$offset_size;  }//英文偏移量的计算公式  
  55.     fseek($fp, $start_offset+$offset,SEEK_SET);//把指针指到要取得字的位置   
  56.     $bindot=fread($fp, $offset_size);          //提取的字  
  57.     for($j=0; $j<$offset_size; $j++)   //一次转换一个字节,把一个字转换为二进制数字  
  58.       {  $dot_string.= sprintf("%08b", ord($bindot[$j]));   
  59.          $total.=sprintf("%08b", ord($bindot[$j])); }      
  60.     $one_word[$i]=$dot_string; //一个字的字节  
  61.     $number.=$one_word[$i];//一行所放的字  
  62.     $circulation++;//循环的次数即一行放的字数  
  63.     if($circulation==$word_number)//当一行放满,就重新开始放下一行  
  64.     {  
  65.       $circulation=0;        
  66.       $_rows++;   
  67.       $Word[$_rows-1]=$number;  
  68.       $number="";  
  69.     }  
  70.  }  
  71.  $Word[$_rows]=$number; //不满一行的字放在这里  
  72.  $lcdrow=json_encode($Word);//PHP转JSON    
  73.  $row_number=(count($one_word))/$word_number; //需要多少行,总数处于一行的数  
  74. fclose($fp); //关闭字库文件  
  75.   
  76.   
  77. ?>  
原文地址:https://www.cnblogs.com/xred/p/8523324.html