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