在线编辑使用到的 js 插件:
qrcodesvg
根据信息绘制二维码插件 colorpicker
用于颜色选择,js绑定事件更改二维码(svg)的颜色canvg
用于将svg格式的二维码转换成 html5 的 canvas ,之后使用 todataurl 方法生成二维码图片的 base64 编码数据 ,通过 ajax 发送给后端热敏打印机打印二维码图片要转成bmp格式。转换图片到bmp的类:
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 $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;$tobmp->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') 进行转换
打印机打印