在線編輯二維碼併發送到熱敏打印機打印

在線編輯

使用到的 js 插件:php

  • qrcodesvg

    • 根據信息繪製二維碼插件
  • colorPicker

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

    • 用於將svg格式的二維碼轉換成 html5 的 canvas ,以後使用 toDataURL 方法生成二維碼圖片的 base64 編碼數據 ,經過 Ajax 發送給後端

熱敏打印機打印二維碼

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

<?php

/**
* class jpg, gif, png =========> BMP
*
* { Description :- 
*   class that resize and convert jpg, gif or png to bmp
* }
* for more info contact with me (mahabub1212@yahoo.com)
* you can modify or use or redistribute this class.
*/
class ToBmp{

    // new image width
    var  $new_width;

    // new image height
    var $new_height;

    // image resources
    var $image_resource;

    function image_info($source_image){
        $img_info = getimagesize($source_image);

        switch ($img_info['mime']){
            case "image/jpeg": { $this->image_resource = imagecreatefromjpeg ($source_image);   break; }
            case "image/gif":  { $this->image_resource = imagecreatefromgif  ($source_image);   break; }
            case "image/png":  { $this->image_resource = imagecreatefrompng  ($source_image);   break; }
            default: {die("圖片錯誤");}
        }
    }


    public function imagebmp($file_path = ''){

        if(!$this->image_resource) die("圖片錯誤");
        $picture_width  = imagesx($this->image_resource);
        $picture_height = imagesy($this->image_resource);


        if(!imageistruecolor($this->image_resource)){
            $tmp_img_reource = imagecreatetruecolor($picture_width,$picture_height);
            imagecopy($tmp_img_reource,$this->image_resource, 0, 0, 0, 0, $picture_width, $picture_height);
            imagedestroy($this->image_resource);
            $this->image_resource = $tmp_img_reource;

        }


        if((int) $this->new_width >0 && (int) $this->new_height > 0){

            $image_resized = imagecreatetruecolor($this->new_width, $this->new_height); 
            imagecopyresampled($image_resized,$this->image_resource,0,0,0,0,$this->new_width,$this->new_height,$picture_width,$picture_height);
            imagedestroy($this->image_resource);
            $this->image_resource =  $image_resized;

        }

        $result = '';

        $biBPLine =  ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $this->new_width * 3 : $picture_width * 3;
        $biStride = ($biBPLine + 3) & ~3;
        $biSizeImage =  ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $biStride * $this->new_height : $biStride * $picture_height;
        $bfOffBits = 54;
        $bfSize = $bfOffBits + $biSizeImage;

        $result .= substr('BM', 0, 2);
        $result .= pack ('VvvV', $bfSize, 0, 0, $bfOffBits);
        $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);

        $numpad = $biStride - $biBPLine;

        $h = ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $this->new_height : $picture_height;
        $w = ((int) $this->new_width >0 &&(int)$this->new_height > 0) ? $this->new_width  : $picture_width;

        for ($y = $h - 1; $y >= 0; --$y) {
            for ($x = 0; $x < $w; ++$x) {
                $col = imagecolorat ($this->image_resource, $x, $y);
                $result .= substr(pack ('V', $col), 0, 3);
            }
            for ($i = 0; $i < $numpad; ++$i) {
                $result .= pack ('C', 0);
            }
        }


      if($file_path == ''){

        header("Content-type: image/bmp");
        echo $result;
      } else {

        $fp = fopen($file_path,"wb");
        fwrite($fp,$result);
        fclose($fp);
        //=============
      }


      return ;  


    }
}

使用方法html5

$ToBMP = new ToBmp();
$ToBMP->image_info($path_to_img);
$ToBMP->new_width  = 255;
$ToBMP->new_height = 255;
$output_path = realpath(PATH.'test.bmp');
$ToBMP->imagebmp($output_path);

BMP格式根據文件頭信息不一樣數據組成結構也不一樣jquery

BMP

個人是24位BMP,去除頭文件54個字節後,每三個字節(RGB)表示一個點。git

合併RGB(三字節合併爲一字節)後二值化像素點(獲得 1bit ,即該點是黑或白。之因此要二值化是由於個人熱敏打印機打印黑白不打印彩色)。github

每 8bit 拼接成1字節後用 '\xx' 的16進制形式表示。數據根據打印機給的接口發送給打印機就能夠打印了。redis

特別注意:

1.unpack的使用canvas

$content = file_get_contents($path_to_img);
$content = unpack("H*", $content); //得到圖片數據的16進製表示

2.後端

‘\xFE’ 表示的是4個字符ide

「\xFE」 表示的是1個字符(即該16進制數字對應的ascii碼字符)

單引號的可以使用 chr('0xFE') 進行轉換

相關文章
相關標籤/搜索