首頁 >後端開發 >php教程 >線上編輯二維碼並發送到熱感式印表機列印

線上編輯二維碼並發送到熱感式印表機列印

WBOY
WBOY原創
2016-07-25 08:46:272717瀏覽
單引號的可使用 chr('0xFE') 進行轉換
線上編輯

使用到的 js 外掛:

qrcodesvg

根據資訊繪製二維碼插件 colorPicker

用於顏色選擇,js綁定事件更改二維碼(svg)的顏色 canvg

用於將svg格式的二維碼轉換成 html5 的 canvas ,之後使用 toDataURL 方法產生二維碼圖片的 base64 編碼資料 ,透過 Ajax 傳送給後端 熱感式印表機列印二維碼

圖片要轉換成BMP格式。轉換圖片到BMP的類別:

  1. /**
  2. * 類別jpg、gif、png =========> BMP
  3. *
  4. * { 說明:-
  5. * 調整jpg、gif 或png 大小並轉換為bmp
  6. * }
  7. * 欲了解更多信息,請聯繫我(mahabub1212@yahoo.com )
  8. * 您可以修改或使用或重新分發此類。
  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 $new_height;
  17. // image resources
  18. var $image_resource; $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 = imagecreate case "image/png": { $this->image_resource = imagecreate ($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); this->image_resource, 0, 0, 0, 0, $picture_width, $picture_height);
  32. imagedestroy($this->image_resource);
  33. $this->image_resource = $tmp_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-this> new_width, $this->new_height);
  38. imagecopyresampled($image_resized,$this->image_resource,0,0,0,0,$this->new_width,$this->new_height,$picture_widight,$picture_height);
  39. $this->image_resource = $image_resized;
  40. }
  41. $result = ''; biBPLine = ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $this->new_width * 3 : $picture_width * 3;
  42. $biStride = ($biBPLine 3) & ~3;
  43. $biSizeImage = ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $biStride * $this->new_height : $biStride * $picture_height;
  44. $bfOffBits = 54;
  45. $bfSize = $bfOffBits $biSizeImage;
  46. $result .= substr('BM', 0, 2);
  47. $result .= substr('BM', 0, 2);
  48. $packresult . ', $bfSize, 0, 0, $bfOffBits);
  49. $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 ('VVVvvVVVVVVV', 40, $picture_width, $picture_heightVVVVVVV', 40, $picture_width, $picture_height, 11, 110 0, $biSizeImage, 0, 0, 0, 0);
  50. $numpad = $biStride - $biBPLine;
  51. $h = ((int) $this->new_width >0 &&& (int)$this->new_height > 0) ? $this->new_height : $picture_height;
  52. $w = ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $this->new_width : $picture_width;
  53. for ($y = $h - 1; $y >= 0; --$y) {
  54. for ($x = 0; $x $col = imagecolorat ($this->image_resource, $x, $y);
  55. $result .= substr(pack ('V', $col), 0, 3);
  56. }
  57. for ($i = 0; $i $result .= pack ('C', 0);
  58. }
  59. }
  60. if($file_path == ''){
  61. header("Content-type: image/bmp");
  62. echo $result;
  63. } else {
  64. $fp = fopen($file_path,"wb");
  65. fwrite($fp,$result);
  66. fclose($fp);
  67. //===== ==========
  68. }
  69. return ;
  70. }
  71. }
  72. 複製程式碼

使用方法

  1. $ToBMP = new ToBmp();
  2. $ToBMP->image_info($path_to_img);
  3. $ToBMP->new_width = 255;new_height = 255;
  4. $output_path = realpath(PATH.'test.bmp');
  5. $ToBMP->imagebmp($output_path);
複製程式碼

複製程式碼

🎜>

線上編輯二維碼並發送到熱感式印表機列印BMP格式依檔案頭資訊不同資料組成結構也不同

我的是24位元BMP,移除頭檔54個位元組後,每三個位元組(RGB)表示一個點。

合併RGB(三字節合併為一位元組)後二值化像素點(得到1bit ,即該點是黑或白。之所以要二值化是因為我的熱敏印表機打印黑白不打印彩色)。

每 8bit 拼接成1位元組後以 'xx' 的16進位形式表示。資料根據印表機給的介面傳送給印表機就可以列印了。
特別注意:
1.unpack的使用量
$content = file_get_contents($path_to_img);
$content = unpack("H*", $content); //取得圖片資料的16進位表示

複製程式碼

2.

‘xFE’ 表示的是4個字

「xFE」 表示的是1個字元(即該16進位數字對應的ascii碼字元)
印表機列印


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn