/** * 图像添加文字 * @param string $text 添加的文字 * @param string $font 字体路径 * @param integer $size 字号 * @param string $color 文字颜色 * @param integer $locate 文字写入位置 * @param integer $offset 文字相对当前位置的偏移量 * @param integer $angle 文字倾斜角度 */ public function text($text, $font, $size, $color = '#00000000', $locate = Image::IMAGE_WATER_SOUTHEAST, $offset = 0, $angle = 0) { //资源检测 if (empty($this->img)) { throw new Exception('没有可以被写入文字的图像资源'); } if (!is_file($font)) { throw new Exception("不存在的字体文件:{$font}"); } //获取颜色和透明度 if (is_array($color)) { $color = array_map('dechex', $color); foreach ($color as &$value) { $value = str_pad($value, 2, '0', STR_PAD_LEFT); } $color = '#' . implode('', $color); } elseif (!is_string($color) || 0 !== strpos($color, '#')) { throw new Exception('错误的颜色值'); } $col = substr($color, 0, 7); $alp = strlen($color) == 9 ? substr($color, -2) : 0; //获取文字信息 $draw = new ImagickDraw(); $draw->setFont(realpath($font)); $draw->setFontSize($size); $draw->setFillColor($col); $draw->setFillAlpha(1 - hexdec($alp) / 127); $draw->setTextAntialias(true); $draw->setStrokeAntialias(true); $metrics = $this->img->queryFontMetrics($draw, $text); /* 计算文字初始坐标和尺寸 */ $x = 0; $y = $metrics['ascender']; $w = $metrics['textWidth']; $h = $metrics['textHeight']; /* 设定文字位置 */ switch ($locate) { /* 右下角文字 */ case Image::IMAGE_WATER_SOUTHEAST: $x += $this->info['width'] - $w; $y += $this->info['height'] - $h; break; /* 左下角文字 */ /* 左下角文字 */ case Image::IMAGE_WATER_SOUTHWEST: $y += $this->info['height'] - $h; break; /* 左上角文字 */ /* 左上角文字 */ case Image::IMAGE_WATER_NORTHWEST: // 起始坐标即为左上角坐标,无需调整 break; /* 右上角文字 */ /* 右上角文字 */ case Image::IMAGE_WATER_NORTHEAST: $x += $this->info['width'] - $w; break; /* 居中文字 */ /* 居中文字 */ case Image::IMAGE_WATER_CENTER: $x += ($this->info['width'] - $w) / 2; $y += ($this->info['height'] - $h) / 2; break; /* 下居中文字 */ /* 下居中文字 */ case Image::IMAGE_WATER_SOUTH: $x += ($this->info['width'] - $w) / 2; $y += $this->info['height'] - $h; break; /* 右居中文字 */ /* 右居中文字 */ case Image::IMAGE_WATER_EAST: $x += $this->info['width'] - $w; $y += ($this->info['height'] - $h) / 2; break; /* 上居中文字 */ /* 上居中文字 */ case Image::IMAGE_WATER_NORTH: $x += ($this->info['width'] - $w) / 2; break; /* 左居中文字 */ /* 左居中文字 */ case Image::IMAGE_WATER_WEST: $y += ($this->info['height'] - $h) / 2; break; default: /* 自定义文字坐标 */ if (is_array($locate)) { list($posx, $posy) = $locate; $x += $posx; $y += $posy; } else { throw new Exception('不支持的文字位置类型'); } } /* 设置偏移量 */ if (is_array($offset)) { $offset = array_map('intval', $offset); list($ox, $oy) = $offset; } else { $offset = intval($offset); $ox = $oy = $offset; } /* 写入文字 */ if ('gif' == $this->info['type']) { $img = $this->img->coalesceImages(); $this->img->destroy(); //销毁原图 do { $img->annotateImage($draw, $x + $ox, $y + $oy, $angle, $text); } while ($img->nextImage()); //压缩图片 $this->img = $img->deconstructImages(); $img->destroy(); //销毁零时图片 } else { $this->img->annotateImage($draw, $x + $ox, $y + $oy, $angle, $text); } $draw->destroy(); }
/** * {@inheritdoc} */ public function annotate($text, $coordX, $coordY, $angle, Drawer $drawer) { return $this->resource->annotateImage($this->getImagickDraw($drawer), $coordX, $coordY, $angle, $text); }
/** * Add watermark text to image * * @param resource $image * @param array $opt * @return resource */ private function imageAddText($image, $color, $text) { if (osc_use_imagick()) { $draw = new ImagickDraw(); $draw->setFillColor('black'); //$color); $draw->setFont($this->font); $draw->setFontSize(30); $metrics = $image->queryFontMetrics($draw, $text); $geometry = $image->getImageGeometry(); switch (osc_watermark_place()) { case 'tl': $offset['x'] = 1; $offset['y'] = $metrics['ascender'] + 1; break; case 'tr': $offset['x'] = $geometry['width'] - $metrics['textWidth'] - 1; $offset['y'] = $metrics['ascender'] + 1; break; case 'bl': $offset['x'] = 1; $offset['y'] = $geometry['height'] - 1; break; case 'br': $offset['x'] = $geometry['width'] - $metrics['textWidth'] - 1; $offset['y'] = $geometry['height'] - 1; break; default: $offset['x'] = $geometry['width'] / 2 - $metrics['textWidth'] / 2; $offset['y'] = $geometry['height'] / 2 - $metrics['ascender'] / 2; break; } $image->annotateImage($draw, $offset['x'], $offset['y'], 0, $text); $image->setImageFormat('jpg'); } else { // allocate text color $color = $this->imageColorAllocateHex($image, $color); // calculate watermark position and get full path to font file $offset = $this->calculateOffset($image, $text); // Add the text to image imagettftext($image, 20, 0, $offset['x'], $offset['y'], $color, $this->font, html_entity_decode($text, null, "UTF-8")); } return $image; }
public function text($text, $font, $size, $color = "#00000000", $locate = THINKIMAGE_WATER_SOUTHEAST, $offset = 0, $angle = 0) { if (empty($this->img)) { throw new Exception("没有可以被写入文字的图像资源"); } if (!is_file($font)) { throw new Exception("不存在的字体文件:{$font}"); } if (is_array($color)) { $color = array_map("dechex", $color); foreach ($color as &$value) { $value = str_pad($value, 2, "0", STR_PAD_LEFT); } $color = "#" . implode("", $color); } else { if (!is_string($color) || 0 !== strpos($color, "#")) { throw new Exception("错误的颜色值"); } } $col = substr($color, 0, 7); $alp = strlen($color) == 9 ? substr($color, -2) : 0; $draw = new ImagickDraw(); $draw->setFont(realpath($font)); $draw->setFontSize($size); $draw->setFillColor($col); $draw->setFillAlpha(1 - hexdec($alp) / 127); $draw->setTextAntialias(true); $draw->setStrokeAntialias(true); $metrics = $this->img->queryFontMetrics($draw, $text); $x = 0; $y = $metrics["ascender"]; $w = $metrics["textWidth"]; $h = $metrics["textHeight"]; switch ($locate) { case THINKIMAGE_WATER_SOUTHEAST: $x += $this->info["width"] - $w; $y += $this->info["height"] - $h; break; case THINKIMAGE_WATER_SOUTHWEST: $y += $this->info["height"] - $h; break; case THINKIMAGE_WATER_NORTHWEST: break; case THINKIMAGE_WATER_NORTHEAST: $x += $this->info["width"] - $w; break; case THINKIMAGE_WATER_CENTER: $x += ($this->info["width"] - $w) / 2; $y += ($this->info["height"] - $h) / 2; break; case THINKIMAGE_WATER_SOUTH: $x += ($this->info["width"] - $w) / 2; $y += $this->info["height"] - $h; break; case THINKIMAGE_WATER_EAST: $x += $this->info["width"] - $w; $y += ($this->info["height"] - $h) / 2; break; case THINKIMAGE_WATER_NORTH: $x += ($this->info["width"] - $w) / 2; break; case THINKIMAGE_WATER_WEST: $y += ($this->info["height"] - $h) / 2; break; default: if (is_array($locate)) { $posy = $locate[1]; $posx = $locate[0]; $x += $posx; $y += $posy; } else { throw new Exception("不支持的文字位置类型"); } } if (is_array($offset)) { $offset = array_map("intval", $offset); $oy = $offset[1]; $ox = $offset[0]; } else { $offset = intval($offset); $ox = $oy = $offset; } if ("gif" == $this->info["type"]) { $img = $this->img->coalesceImages(); $this->img->destroy(); do { $img->annotateImage($draw, $x + $ox, $y + $oy, $angle, $text); } while ($img->nextImage()); $this->img = $img->deconstructImages(); $img->destroy(); } else { $this->img->annotateImage($draw, $x + $ox, $y + $oy, $angle, $text); } $draw->destroy(); }