source($source); } } public function source($source) { if (is_array($source)) { $this->im = $this->create($source[0], $source[1], 1); $this->source = $source[2] ?? false; } else { $this->im = $this->get($source); $this->source = $source; } return $this; } public function cover($cover) { $this->cover = $cover; return $this; } protected function check($file) { if ($this->cover || !file_exists($file)) { return true; } return false; } protected function getDest($name) { if (!$this->source) { $name = md5($name); $path = array_slice(str_split($name, 2), 0, 3); $dest = implode(DIRECTORY_SEPARATOR, $path) . DIRECTORY_SEPARATOR . $name . '.jpg'; return Dever::file('image/' . $dest); } else { return $this->source . '_' . $name . '.jpg'; } } public function getXy($set, $source_x, $source_y, $source_w, $source_h) { $offset = explode('_', $set); if (isset($offset[2]) && $offset[2] == 1) { //完全等比例 if ($source_x > $offset[0]) { $dest_x = $offset[0]; $dest_y = $offset[0]*$source_h; } elseif ($offset[1] > 0 && $source_y > $offset[1]) { $dest_x = $offset[1]*$source_w; $dest_y = $offset[1]; } else { $dest_x = $source_x; $dest_y = $source_y; } } elseif (isset($offset[2]) && $offset[2] == 2) { //按照一定比例 if ($offset[0] == 0 && $offset[1] > 0) { $dest_x = $offset[1]*$source_w; $dest_y = $offset[1]; } elseif ($offset[1] > 0 && $source_x > $source_y && $source_y > $offset[1]) { $dest_x = $offset[1]*$source_w; $dest_y = $offset[1]; } elseif ($source_y > $source_x && $source_x > $offset[0]) { $dest_x = $offset[0]; $dest_y = $offset[0]*$source_h; } elseif ($source_y == $source_x && $offset[0] == $offset[1]) { $dest_x = $offset[0]; $dest_y = $offset[1]; } elseif ($source_x > $source_y && $source_y < $offset[1]) { $dest_x = $offset[1]*$source_w; $dest_y = $offset[1]; } elseif($source_y > $source_x && $source_x < $offset[0]) { $dest_x = $offset[0]; $dest_y = $offset[0]*$source_h; } elseif($source_x > $offset[0]) { $dest_x = $offset[0]; $dest_y = $offset[0]*$source_h; } else { $dest_x = $source_x; $dest_y = $source_y; } } elseif (isset($offset[2]) && $offset[2] == 3) { //按照比例缩放,如有多余则留白(或黑...如果实在留不了白的话) $b = $offset[0]/$offset[1]; $l = $source_x/$source_y; if ($b > $l) { $dest_x = $offset[1]*$source_w; $dest_y = $offset[1]; } else { $dest_x = $offset[0]; $dest_y = $offset[0]*$source_h; } } elseif (isset($offset[2]) && $offset[2] == 4) { //按照一定比例 if ($offset[0] == 0 && $offset[1] > 0) { $dest_x = $offset[1]*$source_w; $dest_y = $offset[1]; } elseif($offset[1] > 0 && $source_x > $source_y && $source_y >= $offset[1]) { $dest_x = $offset[1]*$source_w; $dest_y = $offset[1]; } elseif ($source_y > $source_x && $source_x >= $offset[0]) { $dest_x = $offset[0]; $dest_y = $offset[0]*$source_h; } elseif ($source_y == $source_x && $offset[0] < $offset[1]) { $dest_x = $offset[1]*$source_w; $dest_y = $offset[1]; } elseif ($source_y == $source_x && $offset[0] > $offset[1]) { $dest_x = $offset[0]; $dest_y = $offset[0]*$source_h; } elseif ($source_y == $source_x && $offset[0] == $offset[1]) { $dest_x = $offset[0]; $dest_y = $offset[1]; } elseif ($source_x > $source_y && $source_y < $offset[1]) { $dest_x = $offset[1]*$source_w; $dest_y = $offset[1]; } elseif ($source_y > $source_x && $source_x < $offset[0]) { $dest_x = $offset[0]; $dest_y = $offset[0]*$source_h; } else { $dest_x = $source_x; $dest_y = $source_y; } } else { //直接放大和缩小 $dest_x = $offset[0]; $dest_y = $offset[1]; } return array($dest_x, $dest_y, $offset); } public function position($source_x, $source_y, $dest_x, $dest_y, $position, $offset = 0) { $left = 0; $top = 0; $state = 1; if ($position && is_array($position)) { $left = $position[0]; $top = $position[1]; } elseif ($position) { switch ($position) { case 1: //左上 break; case 2: //左下 $top = $source_y - $dest_y; break; case 3: //右上 $left = $source_x - $dest_x; break; case 4: //右下 $left = $source_x - $dest_x; $top = $source_y - $dest_y; break; case 5: //中间 $left = $source_x/2 - $dest_x/2; $top = $source_y/2 - $dest_y/2; break; case 6: //上中 $left = $source_x/2 - $dest_x/2; break; case 7: //下中 $left = $source_x/2 - $dest_x/2; $top = $source_y - $dest_y; break; case 8: //左中 $top = $source_y/2 - $dest_y/2; break; case 9: //右中 $left = $source_x - $dest_x; $top = $source_y/2 - $dest_y/2; break; case 10: //平铺 $left = -1; $top = -1; break; default : $state = false; break; } } if ($offset && is_array($offset)) { $left = $left + $offset[0]; $top = $top + $offset[1]; } else { $left = $left + $offset; $top = $top + $offset; } return array($left, $top, $state); } public function autowrap(&$autowrap, $fontsize, $angle, $fontface, $string, $width) { // 这几个变量分别是 字体大小, 角度, 字体名称, 字符串, 预设宽度 $content = ""; // 将字符串拆分成一个个单字 保存到数组 letter 中 for ($i=0;$i $width) && ($content !== "")) { $content .= "\n"; $autowrap += $fontsize; } $content .= $l; } return $content; } }