2024年PHP开发者大会日本站

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 宽 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 为 on,但您可以轻松修复此问题。

<?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
18年前
基于felixbruns at <ANTI-SPAM>web dot de 的imagegradientellipse函数,绘制一个支持alpha透明度的渐变填充椭圆。感谢felixbruns!:o)

函数 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
18年前
我快速编写了一个渐变椭圆函数(我从其他渐变函数中借用了一些代码)。它的功能类似于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 );
}

// 这将创建剪切层(两种颜色,两种颜色都将变为透明)

$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
19 年前
这是一个使用 imagefilledellipse 实时创建圆角的简单脚本。它将颜色、背景颜色、宽度、高度和位置(即左上、右下)作为参数。

<?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);

// 绘制椭圆
//takes (resource image, int cx, int cy, int w, int h, int color)

// 右下角
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
22年前
我需要在现有图像上绘制半透明圆圈,使用 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