public function colorize($color, $alpha = 1) { $draw = new ImagickDraw(); $draw->setFillColor($color); if (is_float($alpha)) { $draw->setFillAlpha($alpha); } $geometry = $this->getImageGeometry(); $width = $geometry['width']; $height = $geometry['height']; $draw->rectangle(0, 0, $width, $height); $this->drawImage($draw); }
/** * 图像添加文字 * @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(); }
private function _createFont($font, $fontSize, $color, $alpha) { $draw = new ImagickDraw(); $draw->setFont($font); $draw->setFontSize($fontSize); $draw->setFillColor($color); $draw->setFillAlpha($alpha); return $draw; }
public function render(\ImagickDraw $draw, $frame, $maxFrames, $phaseMultiplier, $phaseDivider) { $innerDistance = 40; $outerDistance = 230; $sequenceFraction = $this->sequence / $this->numberDots; $angle = 2 * M_PI * $sequenceFraction; $trailSteps = 5; $trailLength = 0.1; $offsets = [100 => 0]; for ($i = 0; $i <= $trailSteps; $i++) { $key = intval(50 * $i / $trailSteps); $offsets[$key] = $trailLength * ($trailSteps - $i) / $trailSteps; } //TODO - using a pattern would make the circles look more natural //$draw->setFillPatternURL(); foreach ($offsets as $alpha => $offset) { $distanceFraction = $this->calculateFraction($frame, $maxFrames, $offset, $phaseMultiplier, $phaseDivider); $distance = lerp($distanceFraction, $innerDistance, $outerDistance); $xOffset = $distance * sin($angle); $yOffset = $distance * cos($angle); $draw->setFillColor($this->color); $draw->setFillAlpha($alpha / 100); $xOffset = $xOffset * $this->imageWidth / 500; $yOffset = $yOffset * $this->imageHeight / 500; $xSize = 4 * $this->imageWidth / 500; $ySize = 4 * $this->imageHeight / 500; $draw->circle($xOffset, $yOffset, $xOffset + $xSize, $yOffset + $ySize); } }
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(); }
function setFillAlpha($strokeColor, $fillColor, $backgroundColor) { $draw = new \ImagickDraw(); $draw->setStrokeColor($strokeColor); $draw->setFillColor($fillColor); $draw->setStrokeOpacity(1); $draw->setStrokeWidth(2); $draw->rectangle(100, 200, 200, 300); @$draw->setFillAlpha(0.4); $draw->rectangle(300, 200, 400, 300); $imagick = new \Imagick(); $imagick->newImage(500, 500, $backgroundColor); $imagick->setImageFormat("png"); $imagick->drawImage($draw); header("Content-Type: image/png"); echo $imagick->getImageBlob(); }