• 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. ?>  
  • 相关阅读:
    网络编程
    GUI编程
    Java数组
    Day24
    Day23
    Day22
    Day21
    Day20
    Day19
    Day18
  • 原文地址:https://www.cnblogs.com/xred/p/8523324.html
Copyright © 2020-2023  润新知