使用到的 js 插件:php
圖片要轉成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
個人是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') 進行轉換