Home >Backend Development >PHP Tutorial >Edit the QR code online and send it to a thermal printer for printing

Edit the QR code online and send it to a thermal printer for printing

WBOY
WBOYOriginal
2016-07-25 08:46:272721browse
Online editing

JS plug-in used:

qrcodesvg

Draw QR code plug-in based on information colorPicker

Used for color selection, js binding event changes the color of QR code (svg) canvg

Used to convert the QR code in svg format into html5 canvas, and then use the toDataURL method to generate the base64 encoded data of the QR code image, and send it to the backend through Ajax Thermal printer prints QR code

The picture must be converted to BMP format. Classes for converting images to 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("Image error");}
  24. }
  25. }
  26. public function imagebmp($file_path = ''){
  27. if(! $this->image_resource) die("Picture error");
  28. $picture_width = imagesx($this->image_resource);
  29. $picture_height = imagesy($this->image_resource);
  30. if(!imageistruecolor ($this->image_resource)){
  31. $tmp_img_resource = 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_resource;
  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 < $w; ++$x) {
  56. $col = imagecolorat ($this->image_resource, $x, $y);
  57. $result .= substr(pack ('V', $ col), 0, 3);
  58. }
  59. for ($i = 0; $i < $numpad; ++$i) {
  60. $result .= pack ('C', 0);
  61. }
  62. }
  63. if($file_path == ''){
  64. header("Content-type: image/bmp");
  65. echo $result;
  66. } else {
  67. $fp = fopen($file_path,"wb") ;
  68. fwrite($fp,$result);
  69. fclose($fp);
  70. //=============
  71. }
  72. return ;
  73. }
  74. }
Copy code

How to use

  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);
Copy code

The BMP format has different data composition structures depending on the file header information

Edit the QR code online and send it to a thermal printer for printing

Mine is a 24-bit BMP. After removing 54 bytes of the header file, every three bytes (RGB) represent a point.

Combine RGB (three bytes into one byte) and then binarize the pixel (get 1 bit, that is, the point is black or white. The reason for binarization is because my thermal printer prints black and white but not color) .

Each 8bit is concatenated into 1 byte and expressed in the hexadecimal form of 'xx'. The data can be printed by sending it to the printer according to the interface provided by the printer.

pay attention:

1.Usage of unpack

  1. $content = file_get_contents($path_to_img);
  2. $content = unpack("H*", $content); //Get the hexadecimal representation of the image data
Copy code

2.

‘xFE’ represents 4 characters

"xFE" represents 1 character (that is, the ascii code character corresponding to the hexadecimal number)

Single quotes can be converted using chr('0xFE')

Printer printing


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn