Heim  >  Artikel  >  Backend-Entwicklung  >  在线编辑二维码并发送到热敏打印机打印

在线编辑二维码并发送到热敏打印机打印

WBOY
WBOYOriginal
2016-07-25 08:46:272657Durchsuche
在线编辑

使用到的 js 插件:

qrcodesvg

根据信息绘制二维码插件 colorPicker

用于颜色选择,js绑定事件更改二维码(svg)的颜色 canvg

用于将svg格式的二维码转换成 html5 的 canvas ,之后使用 toDataURL 方法生成二维码图片的 base64 编码数据 ,通过 Ajax 发送给后端 热敏打印机打印二维码

图片要转成BMP格式。转换图片到BMP的类:

  1. /**
  2. * class jpg, gif, png =========> BMP
  3. *
  4. * { Description :-
  5. * class that resize and convert jpg, gif or png to bmp
  6. * }
  7. * for more info contact with me (mahabub1212@yahoo.com)
  8. * you can modify or use or redistribute this class.
  9. */
  10. class ToBmp{
  11. // new image width
  12. var $new_width;
  13. // new image height
  14. var $new_height;
  15. // image resources
  16. var $image_resource;
  17. function image_info($source_image){
  18. $img_info = getimagesize($source_image);
  19. switch ($img_info['mime']){
  20. case "image/jpeg": { $this->image_resource = imagecreatefromjpeg ($source_image); break; }
  21. case "image/gif": { $this->image_resource = imagecreatefromgif ($source_image); break; }
  22. case "image/png": { $this->image_resource = imagecreatefrompng ($source_image); break; }
  23. default: {die("图片错误");}
  24. }
  25. }
  26. public function imagebmp($file_path = ''){
  27. if(!$this->image_resource) die("图片错误");
  28. $picture_width = imagesx($this->image_resource);
  29. $picture_height = imagesy($this->image_resource);
  30. if(!imageistruecolor($this->image_resource)){
  31. $tmp_img_reource = imagecreatetruecolor($picture_width,$picture_height);
  32. imagecopy($tmp_img_reource,$this->image_resource, 0, 0, 0, 0, $picture_width, $picture_height);
  33. imagedestroy($this->image_resource);
  34. $this->image_resource = $tmp_img_reource;
  35. }
  36. if((int) $this->new_width >0 && (int) $this->new_height > 0){
  37. $image_resized = imagecreatetruecolor($this->new_width, $this->new_height);
  38. imagecopyresampled($image_resized,$this->image_resource,0,0,0,0,$this->new_width,$this->new_height,$picture_width,$picture_height);
  39. imagedestroy($this->image_resource);
  40. $this->image_resource = $image_resized;
  41. }
  42. $result = '';
  43. $biBPLine = ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $this->new_width * 3 : $picture_width * 3;
  44. $biStride = ($biBPLine + 3) & ~3;
  45. $biSizeImage = ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $biStride * $this->new_height : $biStride * $picture_height;
  46. $bfOffBits = 54;
  47. $bfSize = $bfOffBits + $biSizeImage;
  48. $result .= substr('BM', 0, 2);
  49. $result .= pack ('VvvV', $bfSize, 0, 0, $bfOffBits);
  50. $result .= ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? pack ('VVVvvVVVVVV', 40, $this->new_width, $this->new_height, 1, 24, 0, $biSizeImage, 0, 0, 0, 0) : pack ('VVVvvVVVVVV', 40, $picture_width, $picture_height, 1, 24, 0, $biSizeImage, 0, 0, 0, 0);
  51. $numpad = $biStride - $biBPLine;
  52. $h = ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $this->new_height : $picture_height;
  53. $w = ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $this->new_width : $picture_width;
  54. for ($y = $h - 1; $y >= 0; --$y) {
  55. for ($x = 0; $x $col = imagecolorat ($this->image_resource, $x, $y);
  56. $result .= substr(pack ('V', $col), 0, 3);
  57. }
  58. for ($i = 0; $i $result .= pack ('C', 0);
  59. }
  60. }
  61. if($file_path == ''){
  62. header("Content-type: image/bmp");
  63. echo $result;
  64. } else {
  65. $fp = fopen($file_path,"wb");
  66. fwrite($fp,$result);
  67. fclose($fp);
  68. //=============
  69. }
  70. return ;
  71. }
  72. }
复制代码

使用方法

  1. $ToBMP = new ToBmp();
  2. $ToBMP->image_info($path_to_img);
  3. $ToBMP->new_width = 255;
  4. $ToBMP->new_height = 255;
  5. $output_path = realpath(PATH.'test.bmp');
  6. $ToBMP->imagebmp($output_path);
复制代码

BMP格式根据文件头信息不同数据组成结构也不同

在线编辑二维码并发送到热敏打印机打印

我的是24位BMP,去除头文件54个字节后,每三个字节(RGB)表示一个点。

合并RGB(三字节合并为一字节)后二值化像素点(得到 1bit ,即该点是黑或白。之所以要二值化是因为我的热敏打印机打印黑白不打印彩色)。

每 8bit 拼接成1字节后用 '\xx' 的16进制形式表示。数据根据打印机给的接口发送给打印机就可以打印了。

特别注意:

1.unpack的使用

  1. $content = file_get_contents($path_to_img);
  2. $content = unpack("H*", $content); //获得图片数据的16进制表示
复制代码

2.

‘\xFE’ 表示的是4个字符

“\xFE” 表示的是1个字符(即该16进制数字对应的ascii码字符)

单引号的可使用 chr('0xFE') 进行转换

打印机打印


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn