imagefilledellipse

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagefilledellipse绘制填充的椭圆

描述

imagefilledellipse(
    GdImage $image,
    int $center_x,
    int $center_y,
    int $width,
    int $height,
    int $color
): bool

在给定 image 上绘制以指定坐标为中心的椭圆。

参数

image

一个 GdImage 对象,由图像创建函数之一返回,例如 imagecreatetruecolor()

center_x

中心的 x 坐标。

center_y

中心的 y 坐标。

width

椭圆宽度。

height

椭圆高度。

color

填充颜色。使用 imagecolorallocate() 创建的颜色标识符。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.0.0 image 现在需要一个 GdImage 实例;以前,需要一个有效的 gd resource

示例

示例 #1 imagefilledellipse() 示例

<?php

// 创建一个空白图像
$image = imagecreatetruecolor(400, 300);

// 填充背景色
$bg = imagecolorallocate($image, 0, 0, 0);

// 为椭圆选择一种颜色
$col_ellipse = imagecolorallocate($image, 255, 255, 255);

// 绘制白色椭圆
imagefilledellipse($image, 200, 150, 300, 200, $col_ellipse);

// 输出图片
header("Content-type: image/png");
imagepng($image);

?>

上面的示例将输出类似于

Output of example : imagefilledellipse()

注释

注意:

imagefilledellipse() 忽略 imagesetthickness()

参见

添加注释

用户贡献的注释 9 个注释

richard at mf2fm dot co dot uk
19 年前
以下是一段使用 imagefilledellipse 的代码,它模拟了当前月相...

用法是 <img src="moon.php?size=100">,它会生成一个 100px x 100px 的图像。如果省略 size,则默认值为 24px x 24px。

<?php

$mps
=2551442.8; // moon phase in seconds (29 days, 12 hours, 44 mins, 2.8 secs)
$position=time()-mktime(10, 32, 0, 1, 25, 2005); // seconds since full moon at 10:32GMT on 25 Jan 2005
$position=($position-$mps*intval($position/$mps))/$mps; // phase from 0 to 1

$position=2*(0.5-$position);
## revised to produce easier to work with...
## $position=1 - full moon
## $position=0 - new moon
## $position=-1 - full moon

$size=$_GET['size'];
if (!
is_numeric($size)) $size=24; // width/height in pixels
$moon=imagecreate($size, $size);
$dark=imagecolorallocate($moon, 0, 34, 68); // background colour for moon
$light=imagecolorallocate($moon, 238, 238, 255); // foreground colour for moon
$corona=imagecolorallocatealpha($moon, 153, 153, 153, 64); // edge of moon (semi-transparent)

##
## Make transparent background
##
$background=imagecolorallocatealpha($moon, 0, 0, 0, 127);
imagefill($moon, 0, 0, $background);

##
## Make the moon!
##
imagefilledellipse($moon, round($size/2), round($size/2), $size, $size, $corona);
if (
$position>-1/$size AND $position<1/$size) imagefilledellipse($moon, round($size/2), round($size/2), $size-2, $size-2, $dark); // new moon
elseif (abs($position)>1-1/$size) imagefilledellipse($moon, round($size/2), round($size/2), $size-2, $size-2, $light); // full moon
elseif ($position>0) {
imagefilledellipse($moon, round($size/2), round($size/2), $size-2, $size-2, $light);
for (
$i=0; $i<$size-2; $i++) {
$xpos=($size-2)/2;
$xpos=1-($i/$xpos);
$xpos=sqrt(1-($xpos*$xpos));
$xpos=($size/2)+($position-0.5)*$xpos*($size-2);
imagesetpixel($moon, round($xpos), $i+1, $dark);
}
for (
$i=0; $i<$size; $i++) {
$set=0;
for (
$j=0; $j<$size; $j++) {
if (!
$set AND imagecolorat($moon, $j, $i)==$dark) $set=1;
elseif (
$set AND imagecolorat($moon, $j, $i)==$light) imagesetpixel($moon, $j, $i, $dark);
}
}
}
else {
imagefilledellipse($moon, round($size/2), round($size/2), $size-2, $size-2, $dark);
for (
$i=0; $i<$size-2; $i++) {
$xpos=($size-2)/2;
$xpos=1-($i/$xpos);
$xpos=sqrt(1-($xpos*$xpos));
$xpos=($size/2)+($position+0.5)*$xpos*($size-2);
imagesetpixel($moon, round($xpos), $i+1, $light);
}
for (
$i=0; $i<$size; $i++) {
$set=0;
for (
$j=0; $j<$size; $j++) {
if (!
$set AND imagecolorat($moon, $j, $i)==$light) $set=1;
elseif (
$set AND imagecolorat($moon, $j, $i)==$dark) imagesetpixel($moon, $j, $i, $light);
}
}
}

##
## And output the picture
##
header ("Content-Type: image/png");
imagepng($moon);
imagedestroy($moon);
?>
Mark
15 年前
这绘制了一个具有可选边框的抗锯齿圆圈。使用 <img src="circle.php?r=50&fg=ff0000&bg=000000&bw=5&bc=ffff00"/> 调用它以绘制一个填充的圆圈,半径=50,前景色=红色,背景色=黑色,边框宽度=5,边框颜色=黄色。假设 register_globals 处于打开状态,但您可以轻松修复它。

<?php
header
('Content-type: image/png');

is_numeric($r) or $r = 8;
is_numeric($bw) or $bw = 0;
strlen($fg)==6 or $fg = 'e8e8e8';
strlen($bg)==6 or $bg = 'ffffff';
strlen($bc)==6 or $bc = '000000';

function
hex2rgb($im,$hex) {
return
imagecolorallocate($im,
hexdec(substr($hex,0,2)),
hexdec(substr($hex,2,2)),
hexdec(substr($hex,4,2))
);
}

$a = $r*2;
$b = $a*4;
$c = $b/2;
$d = $b;
$e = $d-($bw*8);

$im1 = imagecreatetruecolor($b,$b);
$im2 = imagecreatetruecolor($a,$a);
imagefill($im1,0,0,hex2rgb($im1,$bg));
if(
$bw) imagefilledellipse($im1,$c,$c,$d,$d,hex2rgb($im1,$bc));
imagefilledellipse($im1,$c,$c,$e,$e,hex2rgb($im1,$fg));
imagecopyresampled($im2,$im1,0,0,0,0,$a,$a,$b,$b);
imagepng($im2);
?>
sunbox at gmx dot net
17 年前
基于 felixbruns at <ANTI-SPAM>web dot de 的 imagegradientellipse 函数绘制具有 alpha 颜色支持的渐变填充椭圆。感谢 felixbruns :o)

function imagegradientellipsealpha($image, $cx, $cy, $w, $h, $ic, $oc){
$w = abs($w);
$h = abs($h);
$oc = array(0xFF & ($oc >> 0x10), 0xFF & ($oc >> 0x8), 0xFF & $oc);
$ic = array(0xFF & ($ic >> 0x10), 0xFF & ($ic >> 0x8), 0xFF & $ic);
$c0 = ($oc[0] - $ic[0]) / $w;
$c1 = ($oc[1] - $ic[1]) / $w;
$c2 = ($oc[2] - $ic[2]) / $w;
$ot = $oc >> 24;
$it = $ic >> 24;
$ct = ($ot - $it) / $w;
$i = 0;
$j = 0;
$is = ($w<$h)?($w/$h):1;
$js = ($h<$w)?($h/$w):1;
while(1){
$r = $oc[0] - floor($i * $c0);
$g = $oc[1] - floor($i * $c1);
$b = $oc[2] - floor($i * $c2);
$t = $ot - floor($i * $ct);
$c = imagecolorallocatealpha($image, $r, $g, $b, $t);
imageellipse($image, $cx, $cy, $w-$i, $h-$j, $c);
if($i < $w){
$i += $is;
}
if($j < $h){
$j += $js;
}
if($i >= $w && $j >= $h){
break;
}
}
}
felixbruns at <ANTI-SPAM>web dot de
17 年前
我快速制作了一个渐变椭圆函数(我从其他渐变函数中提取了一些代码)。它像 imageellipse 或 imagefilledellipse 一样工作,但有两个颜色参数:$ic 是渐变椭圆的内色,$oc 是外色。

<?php

function imagegradientellipse($image, $cx, $cy, $w, $h, $ic, $oc){
$w = abs($w);
$h = abs($h);
$oc = array(0xFF & ($oc >> 0x10), 0xFF & ($oc >> 0x8), 0xFF & $oc);
$ic = array(0xFF & ($ic >> 0x10), 0xFF & ($ic >> 0x8), 0xFF & $ic);
$c0 = ($oc[0] - $ic[0]) / $w;
$c1 = ($oc[1] - $ic[1]) / $w;
$c2 = ($oc[2] - $ic[2]) / $w;
$i = 0;
$j = 0;
$is = ($w<$h)?($w/$h):1;
$js = ($h<$w)?($h/$w):1;
while(
1){
$r = $oc[0] - floor($i * $c0);
$g = $oc[1] - floor($i * $c1);
$b = $oc[2] - floor($i * $c2);
$c = imagecolorallocate($image, $r, $g, $b);
imagefilledellipse($image, $cx, $cy, $w-$i, $h-$j, $c);
if(
$i < $w){
$i += $is;
}
if(
$j < $h){
$j += $js;
}
if(
$i >= $w && $j >= $h){
break;
}
}
}

?>
ivank at 2xtreme dot net
22 年前
有时,您有 x1、y1、x2、y2 参数,但没有中心、宽度和高度。使用此方法根据您的 x1、y1、x2 和 y2 绘制填充椭圆

ImageFilledEllipse(
$im,
($x1 + round(($x2 - $x1) / 2)),
($y1 + round(($y2 - $y1) / 2)),
($x2 - $x1),
($y2 - $y1),
$color);
jbr at ya-right dot com
18 年前
这是一个很酷的功能,你可以用它来在任何 PNG 或 GIF 图片上制作透明的椭圆形/圆形切口。难点在于找到用于切口层和透明层的颜色,因为你不想将透明索引设置为图像中正在使用的颜色。之后,只要将两张图片叠加在一起就可以了。

你需要的东西...

你想制作切口的尺寸的图片,GIF 或 PNG(真彩色/256)都可以使用!

<?

$original_image = './image.png';
$output_image = './new.png';
$temp_image = './temp'; // 路径和名称(不要包含扩展名)
$is_true_color = true;

$ext = substr ( $original_image, strrpos ( $original_image, '.' ) );
$temp_image .= $ext;
$new = image_get ( $ext, $original_image );
$width = imagesx ( $new );
$height = imagesy ( $new );

// 我们需要创建一个临时缩小的图像,这样我们才能获取颜色
// 在高位真彩色图像中(PNG 16、24 位仅此而已)

if ( $is_true_color )
{
imagetruecolortopalette ( $new, false, 256 );
image_make ( $new, $ext, $temp_image );
imagedestroy ( $new );
$colors = get_rgb ( $temp_image, $ext );
@unlink ( $temp_image );
$new = image_get ( $ext, $original_image );
}
else
{
$colors = get_rgb ( $original_image, $ext );
}

// 这将创建切口层(2 种颜色,两种都会变成透明)

$old = imagecreate ( $width, $height );
imageantialias( $old, true );
imagecolorallocate ( $old, $colors[0]['red'], $colors[0]['green'], $colors[0]['blue'] );
$bg = imagecolorallocate ( $old, $colors[1]['red'], $colors[1]['green'], $colors[1]['blue'] );
imagefilledellipse ( $old, floor ( $width / 2 ), floor ( $height / 2 ), $width, $height, $bg );
imagecolortransparent ( $old, $bg );
imagecopy ( $new, $old, 0, 0, 0, 0, $width, $height );
image_make ( $new, $ext, $output_image );
imagedestroy ( $old );
imagedestroy ( $new );

// 这将两张图片叠加在一起,制作一个漂亮的椭圆形/圆形透明图像切口

$old = imagecreate ( $width, $height );
$new = image_get ( $ext, $output_image );
$tbg = imagecolorallocate ( $old, $colors[0]['red'], $colors[0]['green'], $colors[0]['blue'] );
imagecopy ( $old, $new, 0, 0, 0, 0, $width, $height );
imagecolortransparent ( $old, $tbg );
image_make ( $old, $ext, $output_image );
imagedestroy ( $old );
imagedestroy ( $new );

/*
* 快捷功能 (1,2)
*/

// 返回调用的图像资源

function image_get ( $ext, $name )
{
switch ( $ext )
{
case '.gif'
return ( imagecreatefromgif ( $name ) );
break;
case '.png'
return ( imagecreatefrompng ( $name ) );
break;
}
}

// 输出传递给它的名为的图像

function image_make ( $io, $ext, $name )
{
switch ( $ext )
{
case '.gif'
imagegif ( $io, $name );
break;
case '.png'
imagepng ( $io, $name );
break;
}
}

// 获取 (2) 在当前图像中找不到的颜色

function get_rgb ( $image, $ext )
{
$x = 0;
$colors = array ();
$img = image_get ( $ext, $image );

for ( $color = 10; $color <= 250; $color++ )
{
if ( imagecolorexact ( $img, $color, $color, $color ) == -1 )
{
$colors[] = array ( 'red' => $color, 'green' => $color, 'blue' => $color );

if ( $x == 1 )
{
imagedestroy ( $img );
return ( $colors );
}

$x++;
}
}

imagedestory ( $img );
return ( $colors );
}

?>

你可以在这里尝试演示 (SGML) 捕获一个网页,然后制作多个切口示例!

http://www.ya-right.com/
mark at freegeekchicago dot org
18 年前
这是一个使用 imagefilledellipse 随时创建圆角的简单脚本。它以颜色、bg_color、宽度、高度和位置(即左上角、右下角)作为参数。

<?php
$color
= $_REQUEST['color'];
$bg_color = $_REQUEST['bg_color'];

$c_width = $_REQUEST['width'];
$c_height = $_REQUEST['height'];

$placement = $_REQUEST['placement'];

$width = 2 * $c_width;
$height = 2 * $c_height;

// 创建一个空白图像
$image = imagecreatetruecolor($c_width, $c_height);

// 填充角颜色
$col_ellipse = hex2int($image, $color);

// 填充背景颜色

$bg = hex2int($image, $bg_color);

// 填充背景颜色
imagefill($image, 0, 0, $bg);

// 绘制椭圆
// 接收 (资源图像, 整数 cx, 整数 cy, 整数 w, 整数 h, 整数颜色)

// 右下角
if ($placement == "br") {imagefilledellipse($image, 0, 0, $width, $height, $col_ellipse);}

// 左上角
if ($placement == "tl") {imagefilledellipse($image, $c_width, $c_height, $width, $height, $col_ellipse);}

// 右上角
if ($placement == "tr") {imagefilledellipse($image, 0, $c_height, $width, $height, $col_ellipse);}

// 左下角
if ($placement == "bl") {imagefilledellipse($image, $c_width, 0, $width, $height, $col_ellipse);}

// 输出图片
header("Content-type: image/png");
imagepng($image);

function
hex2int($image, $color) {
$string = str_replace("#","",$color);
$red = hexdec(substr($string,0,2));
$green = hexdec(substr($string,2,2));
$blue = hexdec(substr($string,4,2));

$color_int = imagecolorallocate($image, $red, $green, $blue);
return(
$color_int);
}
?>

你可以这样调用它
<img src="round_test.php?
width=50&height=50&color=fffefe&bg_color=99e1e0&placement=tr">
dave at corecommunications dot us
21 年前
我需要在现有图像上绘制半透明圆圈,使用 imagealphablending($image,true);。事实证明,imagefilledellipse 似乎通过从质心向圆周绘制一系列线来绘制椭圆。问题是,靠近中心的像素非常明显地被多次绘制,产生了类似莫尔纹的效果。此外,0 度(中心到右侧)的线被绘制了两次,因此比它下面的像素暗了两倍。

我的解决方法是在源图像的副本中绘制实心椭圆,然后将它通过 imagecopymerge 复制回原始图像。
harry dot wood at ic dot ac dot uk
23 年前
这将绘制一个旋转的椭圆。如果你不想填充椭圆,那么你不需要三角函数。

function triangle($x1,$y1, $x2,$y2, $x3,$y3, $colour) {
global $im;
$coords = array($x1,$y1, $x2,$y2, $x3,$y3);
imagefilledpolygon($im, $coords, 3, $colour);
}

function rotatedellipse($cx, $cy, $width, $height, $rotateangle, $colour, $filled=true) {
global $im;
$step=15;
$cosangle=cos(deg2rad($rotateangle));
$sinangle=sin(deg2rad($rotateangle));

$squishratio = $height/$width;
$nopreviouspoint = true;
for ($angle=0; $angle<=(180+$step); $angle+=$step) {

$ox = ($width * cos(deg2rad($angle)));
$oy = ($width * sin(deg2rad($angle))) * $squishratio;

$x = ($ox * $cosangle) - ($oy * $sinangle);
$y = ($ox * $sinangle) + ($oy * $cosangle);

if ($nopreviouspoint) {
$px=$x;
$py=$y;
$nopreviouspoint=false;
}

if ($filled) {
triangle($cx, $cy, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
triangle($cx, $cy, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
} else {
imageline($im, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
imageline($im, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
}
$px=$x;
$py=$y;
}
}
To Top