imagecolorset

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorset设置指定调色板索引的颜色

描述

imagecolorset(
    GdImage $image,
    int $color,
    int $red,
    int $green,
    int $blue,
    int $alpha = 0
): ?false

此函数将调色板中的指定索引设置为指定颜色。 这对于在调色板图像中创建类似于填充的效果很有用,而无需执行实际填充的开销。

参数

image

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

color

调色板中的一个索引。

red

红色分量的值。

green

绿色分量的值。

blue

蓝色分量的值。

alpha

alpha 分量的值。

返回值

函数在成功时返回 **null**,在失败时返回 **false**。

变更日志

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

范例

范例 #1 imagecolorset() 范例

<?php
// 创建一个 300x100 的图像
$im = imagecreate(300, 100);

// 将背景设置为红色
imagecolorallocate($im, 255, 0, 0);

// 获取背景的颜色索引
$bg = imagecolorat($im, 0, 0);

// 将背景设置为蓝色
imagecolorset($im, $bg, 0, 0, 255);

// 将图像输出到浏览器
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

参见

添加备注

用户贡献的备注 10 个备注

moxleystratton.com
17 年前
如果你想将彩色图像转换为灰度图像,而不会产生斑点图像,请使用以下颜色计算
<?php
function imagetograyscale($im)
{
if (
imageistruecolor($im)) {
imagetruecolortopalette($im, false, 256);
}

for (
$c = 0; $c < imagecolorstotal($im); $c++) {
$col = imagecolorsforindex($im, $c);
$gray = round(0.299 * $col['red'] + 0.587 * $col['green'] + 0.114 * $col['blue']);
imagecolorset($im, $c, $gray, $gray, $gray);
}
}
?>
heavyraptor2 at hotmail dot com
16 年前
我一直找不到一个简单的函数来 “着色” 图像…… 似乎很多人的 “着色” 图像的含义都不同,因为实际上 “着色” 意味着将旧颜色的灰度值乘以新颜色。 因此,白色像素将变为着色目标颜色的 100%,而黑色像素将保持黑色(我知道我解释得不好…… 希望你理解了,否则请查看函数代码下面的例子)。

<?php
function image_colorize(&$img,$rgb) {
imageTrueColorToPalette($img,true,256);
$numColors = imageColorsTotal($img);

for (
$x = 0; $x < $numColors; $x++) {
list(
$r,$g,$b) = array_values(imageColorsForIndex($img,$x));

// 计算灰度值百分比
$grayscale = ($r + $g + $b) / 3 / 0xff;

imageColorSet($img,$x,
$grayscale * $rgb[0],
$grayscale * $rgb[1],
$grayscale * $rgb[2]
);
}

return
true;
}
?>

使用示例
<?php
$color
= array(0xff,0xaa,0x2a); // 要转换的颜色
$url = 'http://sundog.net/images/uploads/1_google_logo.jpg';
$img = imageCreateFromJpeg($url);

image_colorize($img,$color);

header('Content-type: image/gif');
imageGif($img);
exit;
?>

享受
dade dot c at email dot it
19 年前
如果你想在你的网站上实现一个颜色主题系统,这将非常有用...试试吧
Davide Candiloro 意大利

函数 colorize ($pngpath, $r, $g, $b)
/*
要求:$pngpath 必须是具有 64 色调色板的灰度 PNG-8 图像的有效路径
$r, $g, $b 必须是 0..255 范围内的整数
效果:返回用 $r, $g, $b 表示的颜色着色的 png 图像。
*/
{
header("Content-type: image/png");
$im = imagecreatefrompng("images/table.png");

imagetruecolortopalette($im, FALSE, 256);

for ($c = 0; $c < 64; $c++){ /*64 是 PNG-8 调色板中的颜色数量*/
$col = imagecolorsforindex($im, $c);
imagecolorset ( $im, $c, $r*$col['red']/256, $g*$col['green']/256, $b*$col['blue']/256); /*用彩色调色板替换原始灰度调色板*/
}

imagepng($im);
imagedestroy($im);
}
m4551 at abasoft dot it
20 年前
这里有一个函数可以将图像灰度化,即使是从真彩色源(jpeg 或 png)开始。

质量略差,但非常快...

函数 imagegreyscale(&$img, $dither=1) {
if (!($t = imagecolorstotal($img))) {
$t = 256;
imagetruecolortopalette($img, $dither, $t);
}
for ($c = 0; $c < $t; $c++) {
$col = imagecolorsforindex($img, $c);
$min = min($col['red'],$col['green'],$col['blue']);
$max = max($col['red'],$col['green'],$col['blue']);
$i = ($max+$min)/2;
imagecolorset($img, $c, $i, $i, $i);
}
}
Thomas Mueller
16 年前
这里有一个函数可以为图片着色渐变风格。

你只需要传递一个 img 对象和一个颜色数组。

例如:

$arr = array('#000000', '#990000', '#00FFFF', '#FFFFDD');
colorize ($img, $arr);

<?php
function colorize($imgdata, $palette)
{
imageTrueColorToPalette($imgdata,false,0xFF);
$l = count($palette)-1;
$i = imagecolorstotal($imgdata);
while (
$i--)
{
list(
$r,$g,$b) = array_values(imageColorsForIndex($imgdata,$i));

$grayscale = ($r*.3 + $g*.59 +$b*.11) / 0xFF;

$pos = $l*$grayscale;

$perc = $pos-floor($pos);

$tbase = str_replace("#", '', $palette[$pos]);
$baseR = hexdec(substr($tbase,0,2));
$baseG = hexdec(substr($tbase,2,2));
$baseB = hexdec(substr($tbase,4,2));

$tmix = str_replace("#", '', $palette[$pos+1]);
$mixR = hexdec(substr($tmix,0,2));
$mixG = hexdec(substr($tmix,2,2));
$mixB = hexdec(substr($tmix,4,2));

$resR = $baseR+($mixR-$baseR)*$perc;
$resG = $baseG+($mixG-$baseG)*$perc;
$resB = $baseB+($mixB-$baseB)*$perc;

imagecolorset($imgdata, $i, $resR, $resG, $resB);
}
}
?>
Daniel Klein
9 年前
如果你从头开始创建一个调色板图像,你必须使用 imagecolorallocate() 为每个索引分配颜色,然后才能在它上面使用 imagecolorset()。
Bartman
14 年前
我遇到了和 heavyraptor2 一样的问题,所以我就写了这个函数...
<?php
function imagecolorize($im,$endcolor){
// 该函数接收图片,将黑色转换为 $endcolor,白色转换为白色,
// 其余颜色则对应渐变。
//$endcolor 应为 6 位的 HTML 颜色代码。

// 确保图片拥有可用的调色板。
if (imageistruecolor($im)) {
imagetruecolortopalette($im, false, 256);
}

// 首先将图片转换为灰度图,以确保结果一致(感谢 moxleystratton.com)。
// 如果你想要根据其他通道进行处理(例如,红色通道),
// 请注释掉此循环并查看最后循环中的 $gray 变量。
for ($c = 0; $c < imagecolorstotal($im); $c++) {
$col = imagecolorsforindex($im, $c);
$gray = round(0.299 * $col['red'] + 0.587 * $col['green'] + 0.114 * $col['blue']);
imagecolorset($im, $c, $gray, $gray, $gray);
}

// 将结束颜色转换为十六进制数。
$EndcolorRGB['r'] = hexdec( substr($endcolor, 0, 2));
$EndcolorRGB['g'] = hexdec( substr($endcolor, 2, 2));
$EndcolorRGB['b'] = hexdec( substr($endcolor, 4, 2));

// 计算渐变的步长。
$stepR = (255-$EndcolorRGB['r'])/255.0;
$stepG = (255-$EndcolorRGB['g'])/255.0;
$stepB = (255-$EndcolorRGB['b'])/255.0;

// $aColor 数组包含从结束颜色(i=0)到白色(i=255)的 256 种渐变颜色。
$aColor = array();
for (
$i = 0; $i<=255; $i++){
$aColor[$i]['r'] = $EndcolorRGB['r'] + ($i*$stepR);
$aColor[$i]['g'] = $EndcolorRGB['g'] + ($i*$stepG);
$aColor[$i]['b'] = $EndcolorRGB['b'] + ($i*$stepB);
}

// 遍历每个颜色索引,将 $gray 值替换为 $aColor 数组中的值。
for ($c = 0; $c < imagecolorstotal($im); $c++){
$currentColorRGB = imagecolorsforindex($im, $c);
$gray = $currentColorRGB['red'];// 图片为灰度图,因此红、绿、蓝的值应该相等。
// 使用该值作为 $aColor 数组的键。
imagecolorset($im,$c,(int)$aColor[$gray]['r'], (int)$aColor[$gray]['g'], (int)$aColor[$gray]['b']);
}
}
?>
olivier at moostik dot net
23 年前
该函数使用 0>100 的范围更改图片的每个主要颜色的颜色。

int ImageSelectiveColor (int im, int red, int green, int blue)

im 是图片指针。
red、green 和 blue 的范围为 0->100。

function ImageSelectiveColor($im,$red,$green,$blue)
{
for($i=0;$i<imagecolorstotal($im);$i++)
{
$col=ImageColorsForIndex($im,$i);
$red_set=$red/100*$col['red'];
$green_set=$green/100*$col['green'];
$blue_set=$blue/100*$col['blue'];
if($red_set>255)$red_set=255;
if($green_set>255)$green_set=255;
if($blue_set>255)$blue_set=255;
imagecolorset($im,$i,$red_set,$green_set,$blue_set);

}
return $im;

}
admin at phpgfx dot com
16 年前
这是一个将图片转换为纯黑白的函数。

<?php

function imagepurebw( $img, $amount = 383 ) {
$total = imagecolorstotal( $img );
for (
$i = 0; $i < $total; $i++ ) {
$index = imagecolorsforindex( $img, $i );
array_pop( $index );
$color = ( array_sum( $index ) > $amount ) ? 255 : 0;
imagecolorset( $img, $i, $color, $color, $color );
}
}

?>
info at devking dot com
22 年前
这是一个将图片转换为灰度图的简单函数。

function imagecolorgrey( &$img ) {
for( $i=0; $i<imagecolorstotal( $img ); $i++ ) {
$c = ImageColorsForIndex( $img, $i );
$t = ($c["red"]+$c["green"]+$c["blue"])/3;
imagecolorset( $img, $i, $t, $t, $t );
}
}
To Top