php的gd颜色不对,php - PHP GD调色板颜色 - 堆栈内存溢出

检查imagecolorstotal的返回值,无论您设置多少要抖动的颜色数量,总是得到256种颜色作为返回。 PNG-8和GIF格式仅支持最多256种颜色的调色板。 因此,即使您可以在调色板中使用超过256个,您也必须将其保存为真正的颜色,以便任何人都可以使用它,从而使整个转换过程浪费时间。 换句话说, imagetruecolortopallete的上限为256色,你不能更高。

这是你如何在truecolor中做到这一点,虽然它是资源密集型的。 如果你想更有效地做这件事,也许可以看看imagemagick。

$im = imagecreatefrompng("lamb.png");

$img = imagecreatetruecolor(imagesx($im), imagesy($im));

$degrees = 0;

if ($degrees > 360) {$degrees = $degrees % 360 ;}

foreach (range(0, imagesx($im) - 1) as $x ) {

foreach (range(0, imagesy($im) - 1) as $y) {

$rgb = imagecolorat($im, $x, $y);

$r = ($rgb >> 16) & 0xFF;

$g = ($rgb >> 8) & 0xFF;

$b = $rgb & 0xFF;

$hsv = rgbtohsv($r,$g,$b);

$rgb = hsvtorgb($degrees, $hsv['s'], $hsv['v']);

imagesetpixel($img, $x,$y,imagecolorallocate($img, $rgb['r'], $rgb['g'], $rgb['b']));

}

}

imagepng($img, 'lamb2.png');

编辑:添加rgbtohsv和hsvtorgb函数。 我没有写这些功能。

function rgbtohsv ($R, $G, $B) {

// HSV Results:Number 0-1

$HSL = array();

$var_R = ($R / 255);

$var_G = ($G / 255);

$var_B = ($B / 255);

$var_Min = min($var_R, $var_G, $var_B);

$var_Max = max($var_R, $var_G, $var_B);

$del_Max = $var_Max - $var_Min;

$V = $var_Max;

if ($del_Max == 0)

{

$H = 0;

$S = 0;

}

else

{

$S = $del_Max / $var_Max;

$del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;

$del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;

$del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;

if ($var_R == $var_Max) $H = $del_B - $del_G;

else if ($var_G == $var_Max) $H = ( 1 / 3 ) + $del_R - $del_B;

else if ($var_B == $var_Max) $H = ( 2 / 3 ) + $del_G - $del_R;

if ($H<0) $H++;

if ($H>1) $H--;

}

$HSL['h'] = $H;

$HSL['s'] = $S;

$HSL['v'] = $V;

return $HSL;

}

function hsvtorgb ($H, $S, $V)

{

$RGB = array();

if($S == 0)

{

$R = $G = $B = $V * 255;

}

else

{

$var_H = $H * 6;

$var_i = floor( $var_H );

$var_1 = $V * ( 1 - $S );

$var_2 = $V * ( 1 - $S * ( $var_H - $var_i ) );

$var_3 = $V * ( 1 - $S * (1 - ( $var_H - $var_i ) ) );

if ($var_i == 0) { $var_R = $V ; $var_G = $var_3 ; $var_B = $var_1 ; }

else if ($var_i == 1) { $var_R = $var_2 ; $var_G = $V ; $var_B = $var_1 ; }

else if ($var_i == 2) { $var_R = $var_1 ; $var_G = $V ; $var_B = $var_3 ; }

else if ($var_i == 3) { $var_R = $var_1 ; $var_G = $var_2 ; $var_B = $V ; }

else if ($var_i == 4) { $var_R = $var_3 ; $var_G = $var_1 ; $var_B = $V ; }

else { $var_R = $V ; $var_G = $var_1 ; $var_B = $var_2 ; }

$R = $var_R * 255;

$G = $var_G * 255;

$B = $var_B * 255;

}

$RGB['r'] = $R;

$RGB['g'] = $G;

$RGB['b'] = $B;

return $RGB;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值