PHP对图像函数进行封装,以左下角为坐标原点
来源:互联网 发布:电脑语音变声软件 编辑:程序博客网 时间:2024/05/17 04:36
目标:
1.调整坐标系,以左下角为坐标原点(0,0)
2.链式操作
3.简化读取图片文件操作
4.简化颜色操作
示例:
$image=new SDraw(); $dataUrl=$image->create(20,20,'white') ->line(0,0,0,19,'black') ->line(0,0,19,0) ->line(0,0,5,10,'#080') ->line(5,10,10,5,'red') ->line(10,5,15,19,'green') ->line(15,19,19,15,'red') ->dataUrl();
类的实现
<?php/** * 图像绘制类,调整坐标系统,以左下角为原点(0,0) * * User: 蓝冰 * Date: 2017/9/27 * Time: 9:28 */class SDraw{ public function __construct() { } //图像宽高,像素 private $width, $height; /** * @var resource 图像资源句柄 */ private $handle; /** * @var string 原始图像文件格式 */ private $sourceType; /** * 创建一个新图像 * @param $width int * @param $height int * @param $back string 背景颜色 * @param $trueColor bool 是否是真彩色图像 * @return $this */ public function create($width, $height, $back = 'white', $trueColor = false) { $this->width = intval($width); $this->height = intval($height); //是否创建真彩色 if ($trueColor) { $this->handle = imagecreatetruecolor($width, $height); } else { $this->handle = imagecreate($width, $height); } //如果指定了背景色,则用矩形 imagerectangle($this->handle, 0, 0, $this->width - 1, $this->height - 1, $this->color($back)); return $this; } /** * 从字符串内容中创建图像(可以是文件内容,也可以是DATAURL) * @param $string string * @return $this */ public function fromString($string) { $this->handle = imagecreatefromstring($string); $this->sourceType = 'string'; return $this; } /** * 从文件读取一个图像 * @param $file string 文件名 * @return $this * @throws */ public function fromFile($file) { //取文件前八个字节 $header = file_get_contents($file, 0, null, 0, 8); // GIF 图像 if (left($header, 3) == 'GIF') { $this->handle = imagecreatefromgif($file); $this->sourceType = 'gif'; return $this; } // JPEG 图像 if (bin2hex(left($header, 2)) == 'ffd8') { $this->handle = imagecreatefromjpeg($file); $this->sourceType = 'jpeg'; return $this; } //判断是PNG, *png if (bin2hex($header) == '89504e470d0a1a0a') { $this->handle = imagecreatefrompng($file); $this->sourceType = 'png'; return $this; } // WBMP 图像 if (bin2hex(left($header, 4)) == '00001414') { $this->handle = imagecreatefromwbmp($file); $this->sourceType = 'wbmp'; return $this; } // WEBP 图像 if (left($header, 4) == 'RIFF') { $this->handle = imagecreatefromwebp($file); $this->sourceType = 'webp'; return $this; } // GD 图像 if (bin2hex($header) == 'ffff001400140000') { $this->handle = imagecreatefromgd($file); $this->sourceType = 'gd'; return $this; } // GD2 图像 if (bin2hex(left($header, 3)) == '676432') { $this->handle = imagecreatefromgd2($file); $this->sourceType = 'gd2'; return $this; } // XBM 图像 if ($header == '#define ') { $this->handle = imagecreatefromxbm($file); $this->sourceType = 'xbm'; return $this; } //不认识 throw new Exception('unknown image file:' . $file . ' HEADER:' . bin2hex($header)); } /** * 创建DataUrl格式 * @return string */ public function dataUrl() { //保存原输出缓冲区内容 $ob = ob_get_clean(); //生成本图像的内容到缓冲区(以PNG格式) imagepng($this->handle); //从缓冲区取回本图像内容 $image = ob_get_clean(); //恢复缓冲区 echo $ob; //创建DataURL return 'data:' . image_type_to_mime_type(IMAGETYPE_PNG) . ';base64,' . base64_encode($image); } /** * 输出图像内容,以PNG格式 * @return $this */ public function output() { header('Content-Type: ' . image_type_to_mime_type(IMAGETYPE_PNG)); imagepng($this->handle); return $this; } /** * 析构时释放图像句柄 */ public function __destruct() { //如果已经创建了图像句柄 if (is_resource($this->handle)) { imagedestroy($this->handle); $this->handle = null; } } //本图像使用到的颜色集 private $colors = []; //颜色名称与颜色值对照表 private $colorNames = [ 'black' => '#000000', 'navy' => '#000080', 'darkblue' => '#00008b', 'mediumblue' => '#0000cd', 'blue' => '#0000ff', 'darkgreen' => '#006400', 'green' => '#008000', 'teal' => '#008080', 'darkcyan' => '#008b8b', 'deepskyblue' => '#00bfff', 'darkturquoise' => '#00ced1', 'mediumspringgreen' => '#00fa9a', 'lime' => '#00ff00', 'springgreen' => '#00ff7f', 'aqua' => '#00ffff', 'cyan' => '#00ffff', 'midnightblue' => '#191970', 'dodgerblue' => '#1e90ff', 'lightseagreen' => '#20b2aa', 'forestgreen' => '#228b22', 'seagreen' => '#2e8b57', 'darkslategray' => '#2f4f4f', 'limegreen' => '#32cd32', 'mediumseagreen' => '#3cb371', 'turquoise' => '#40e0d0', 'royalblue' => '#4169e1', 'steelblue' => '#4682b4', 'darkslateblue' => '#483d8b', 'mediumturquoise' => '#48d1cc', 'indigo' => '#4b0082', 'darkolivegreen' => '#556b2f', 'cadetblue' => '#5f9ea0', 'cornflowerblue' => '#6495ed', 'mediumaquamarine' => '#66cdaa', 'dimgray' => '#696969', 'dimgrey' => '#696969', 'slateblue' => '#6a5acd', 'olivedrab' => '#6b8e23', 'slategray' => '#708090', 'lightslategray' => '#778899', 'mediumslateblue' => '#7b68ee', 'lawngreen' => '#7cfc00', 'chartreuse' => '#7fff00', 'aquamarine' => '#7fffd4', 'maroon' => '#800000', 'purple' => '#800080', 'olive' => '#808000', 'gray' => '#808080', 'skyblue' => '#87ceeb', 'lightskyblue' => '#87cefa', 'blueviolet' => '#8a2be2', 'darkred' => '#8b0000', 'darkmagenta' => '#8b008b', 'saddlebrown' => '#8b4513', 'darkseagreen' => '#8fbc8f', 'lightgreen' => '#90ee90', 'mediumpurple' => '#9370db', 'darkviolet' => '#9400d3', 'palegreen' => '#98fb98', 'darkorchid' => '#9932cc', 'yellowgreen' => '#9acd32', 'sienna' => '#a0522d', 'brown' => '#a52a2a', 'darkgray' => '#a9a9a9', 'lightblue' => '#add8e6', 'greenyellow' => '#adff2f', 'paleturquoise' => '#afeeee', 'lightsteelblue' => '#b0c4de', 'powderblue' => '#b0e0e6', 'firebrick' => '#b22222', 'darkgoldenrod' => '#b8860b', 'mediumorchid' => '#ba55d3', 'rosybrown' => '#bc8f8f', 'darkkhaki' => '#bdb76b', 'silver' => '#c0c0c0', 'mediumvioletred' => '#c71585', 'indianred' => '#cd5c5c', 'peru' => '#cd853f', 'chocolate' => '#d2691e', 'tan' => '#d2b48c', 'lightgray' => '#d3d3d3', 'thistle' => '#d8bfd8', 'orchid' => '#da70d6', 'goldenrod' => '#daa520', 'palevioletred' => '#db7093', 'crimson' => '#dc143c', 'gainsboro' => '#dcdcdc', 'plum' => '#dda0dd', 'burlywood' => '#deb887', 'lightcyan' => '#e0ffff', 'lavender' => '#e6e6fa', 'darksalmon' => '#e9967a', 'violet' => '#ee82ee', 'palegoldenrod' => '#eee8aa', 'lightcoral' => '#f08080', 'khaki' => '#f0e68c', 'aliceblue' => '#f0f8ff', 'honeydew' => '#f0fff0', 'azure' => '#f0ffff', 'sandybrown' => '#f4a460', 'wheat' => '#f5deb3', 'beige' => '#f5f5dc', 'whitesmoke' => '#f5f5f5', 'mintcream' => '#f5fffa', 'ghostwhite' => '#f8f8ff', 'salmon' => '#fa8072', 'antiquewhite' => '#faebd7', 'linen' => '#faf0e6', 'lightgoldenrodyellow' => '#fafad2', 'oldlace' => '#fdf5e6', 'red' => '#ff0000', 'fuchsia' => '#ff00ff', 'magenta' => '#ff00ff', 'deeppink' => '#ff1493', 'orangered' => '#ff4500', 'tomato' => '#ff6347', 'hotpink' => '#ff69b4', 'coral' => '#ff7f50', 'darkorange' => '#ff8c00', 'lightsalmon' => '#ffa07a', 'orange' => '#ffa500', 'lightpink' => '#ffb6c1', 'pink' => '#ffc0cb', 'gold' => '#ffd700', 'peachpuff' => '#ffdab9', 'navajowhite' => '#ffdead', 'moccasin' => '#ffe4b5', 'bisque' => '#ffe4c4', 'mistyrose' => '#ffe4e1', 'blanchedalmond' => '#ffebcd', 'papayawhip' => '#ffefd5', 'lavenderblush' => '#fff0f5', 'seashell' => '#fff5ee', 'cornsilk' => '#fff8dc', 'lemonchiffon' => '#fffacd', 'floralwhite' => '#fffaf0', 'snow' => '#fffafa', 'yellow' => '#ffff00', 'lightyellow' => '#ffffe0', 'ivory' => '#fffff0', 'white' => '#ffffff', ]; /** * 根据给定的颜色: 名称/#rgb/#rrggbb 返回颜色标识符 * @param $color string 名称/#rgb/#rrggbb * @return mixed 颜色标识符 * @throws Exception 不认识的颜色 */ private function color($color) { //如果不指定颜色,使用最后一次的颜色标识符 if (!$color) { return $this->lastColor; } //全部小写 $color = strtolower($color); if (isset($this->colorNames[$color])) { //如果给定的是颜色名称 $rgb = $this->colorNames[$color]; } else { //给定的是颜色值 //加上左#号 if (left($color, 1) != '#') { $rgb = '#' . $color; } else { $rgb = $color; } //必须以16进制指定颜色值 if (!preg_match('/^#[a-f0-9]*$/', $rgb)) { throw new Exception('color unknown:' . $color); } //可以是3位 rgb if (strlen($rgb) == 4) { $rgb = '#' . $rgb{1} . $rgb{1} . $rgb{2} . $rgb{2} . $rgb{3} . $rgb{3}; } elseif (strlen($rgb) != 7) { throw new Exception('color error:' . $color); } } //如果尚未分配,则分配标识符 if (!isset($this->colors[$rgb])) { $r = hexdec(substr($rgb, 1, 2)); $g = hexdec(substr($rgb, 3, 2)); $b = hexdec(substr($rgb, 5, 2)); $this->colors[$rgb] = imagecolorallocate($this->handle, $r, $g, $b); } //返回标识符 $this->lastColor = $this->colors[$rgb]; return $this->lastColor; } /** * 纵坐标翻转, 以实现 左下角为原点 * @param $y int 左下角为原点的纵坐标 * @return int 左上角为原点的纵坐标 */ private function y($y) { $y = intval($y); $y = min($y, $this->height - 1); return $this->height - 1 - $y; } //最后一次使用的颜色 private $lastColor = 'black'; /** * 画线 * @param $color string 颜色名称或颜色值 * @param $x1 int * @param $y1 int * @param $x2 int * @param $y2 int * @return $this */ public function line($x1, $y1, $x2, $y2, $color = null) { imageline($this->handle, $x1, $this->y($y1), $x2, $this->y($y2), $this->color($color)); return $this; } public function wbmp($file, $foreground = null) { imagewbmp($this->handle, $file, $foreground); return $this; } public function png($file, $quality = null, $filters = null) { imagepng($this->handle, $file, $quality, $filters); }}
当前只实现了简单的几个方法,其他方法,用到的时候再补充
阅读全文
0 0
- PHP对图像函数进行封装,以左下角为坐标原点
- 图像旋转之以原点为中心
- 从摄像头获得图像的坐标原点是在左下角(OpenCV中IplImage结构中的origin成员)
- 坐标:开发中屏幕坐标以屏幕左上角为坐标原点
- PHP---对crud进行封装
- Android对图像进行各种对称显示(以矩形为例)
- 【CSS3】transform-origin以原点进行旋转
- IplImage origin参数对图像原点有影响
- iOS MKMapView 以某一坐标为中心进行缩放
- iOS开发笔记之设置self.view原点为导航栏左下角
- 使用PHP调用Mysql数据库函数封装,对数据库进行增删改查
- 对EntityManager进行封装以简化JPA操作
- 鼠标移上去以中心为原点慢慢出现
- 以单词为单位,对字符串进行反转
- vml的坐标原点
- opencv的坐标原点
- PHP使用类对mysql的使用进行封装
- PHP自定义函数对目录进行遍历
- hadoop之yarn的资源分配详解
- [NLP]1.StanfordNLP的安装和初探
- 设计模式9-外观模式
- 第四周 建立双链表算法库
- Lua文件夹及文件操作(清空文件夹下所有文件、创建多级文件夹、删除文件夹所有文件等)
- PHP对图像函数进行封装,以左下角为坐标原点
- linux gcc -l参数和-L参数用法含义
- 间歇供料机构
- mysql5.7绿色版配置
- Android深度探索:HAL与驱动开发学习笔记(三)
- ios,安卓实现video小屏播放,不全屏播放的方法
- 字符串加密解密工具
- 第四周项目1-两种方法建立单链表
- python2抓取某虚拟币网数据的小程序