線上編輯
使用到的 js 外掛:
qrcodesvg
根據資訊繪製二維碼插件
colorPicker
用於顏色選擇,js綁定事件更改二維碼(svg)的顏色
canvg
用於將svg格式的二維碼轉換成 html5 的 canvas ,之後使用 toDataURL 方法產生二維碼圖片的 base64 編碼資料 ,透過 Ajax 傳送給後端
熱感式印表機列印二維碼
圖片要轉換成BMP格式。轉換圖片到BMP的類別:
- /**
- * 類別jpg、gif、png =========> BMP
- *
- * { 說明:-
- * 調整jpg、gif 或png 大小並轉換為bmp
- * }
- * 欲了解更多信息,請聯繫我(mahabub1212@yahoo.com )
- * 您可以修改或使用或重新分發此類。
- */
- class ToBmp{
-
- // new image width
- var🎜 $new_width;
-
- // new image height
- var $new_height;
-
- // image resources
- var $new_height;
-
- // image resources
- var $image_resource; $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 = imagecreate case "image/png": { $this->image_resource = imagecreate ($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); this->image_resource, 0, 0, 0, 0, $picture_width, $picture_height);
- imagedestroy($this->image_resource);
- $this->image_resource = $tmp_image_resource);
- $this->image_resource = $tmp_img_reource
- ; }
-
-
- if((int) $this->new_width >0 && (int) $this->new_height > 0){
-
- $image_resized = imagecreatetruecolor($$this-this> new_width, $this->new_height);
- imagecopyresampled($image_resized,$this->image_resource,0,0,0,0,$this->new_width,$this->new_height,$picture_widight,$picture_height);
- $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 .= substr('BM', 0, 2);
- $packresult . ', $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 ('VVVvvVVVVVVV', 40, $picture_width, $picture_heightVVVVVVV', 40, $picture_width, $picture_height, 11, 110 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 $col = imagecolorat ($this->image_resource, $x, $y);
- $result .= substr(pack ('V', $col), 0, 3);
- }
- for ($i = 0; $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 ;
-
-
- }
- }
-
-
- 複製程式碼
使用方法
- $ToBMP = new ToBmp();
- $ToBMP->image_info($path_to_img);
- $ToBMP->new_width = 255;new_height = 255;
- $output_path = realpath(PATH.'test.bmp');
- $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碼字元)
|
單引號的可使用 chr('0xFE') 進行轉換