PHP Conference Japan 2024

imagecolorsforindex

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

imagecolorsforindex获取索引的颜色

描述

imagecolorsforindex(GdImage $image, int $color): array

获取指定索引的颜色。

参数

image

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

color

颜色索引。

返回值

返回一个关联数组,其中包含 red、green、blue 和 alpha 键,这些键包含指定颜色索引的相应值。

变更日志

版本 描述
8.0.0 image 现在期望一个 GdImage 实例;之前,期望一个有效的 gd resource
8.0.0 imagecolorsforindex() 现在如果 color 超出范围,则会抛出一个 ValueError 异常;之前,会返回 false

示例

示例 #1 imagecolorsforindex() 示例

<?php

// 打开一个图像
$im = imagecreatefrompng('nexen.png');

// 获取颜色
$start_x = 40;
$start_y = 50;
$color_index = imagecolorat($im, $start_x, $start_y);

// 使其可读
$color_tran = imagecolorsforindex($im, $color_index);

// 它是什么?
print_r($color_tran);

?>

以上示例将输出类似以下内容

Array
(
   [red] => 226
   [green] => 222
   [blue] => 252
   [alpha] => 0
)

参见

添加注释

用户贡献的注释 10 条注释

matrebatre
16 年前
请注意

<?php
$rgba
= imagecolorat($image, $x, $y);
$r = ($rgba >> 16) & 0xFF;
$g = ($rgba >> 8) & 0xFF;
$b = $rgba & 0xFF;
$a = ($rgba & 0x7F000000) >> 24;
?>

仅适用于真彩色图像。对于例如 GIF 图像,这将产生奇怪的结果。对于 GIF 图像,您应该始终使用 imagecolorsforindex()。
slepichev at yahoo dot com
17 年前
如果要更改特定颜色的强度或亮度级别,则需要将颜色格式从 RGB 转换为 HSL。
以下函数将 RGB 数组(红色、绿色、蓝色)转换为 HSL 数组(色相、饱和度、亮度)


<?php
/**
* 将 RGB 颜色数组转换为 HSL 数组
*
* @param array $ RGB 颜色集
* @return array HSL 集合
*/
function rgb2hsl($rgb){

$clrR = ($rgb[0] / 255);
$clrG = ($rgb[1] / 255);
$clrB = ($rgb[2] / 255);

$clrMin = min($clrR, $clrG, $clrB);
$clrMax = max($clrR, $clrG, $clrB);
$deltaMax = $clrMax - $clrMin;

$L = ($clrMax + $clrMin) / 2;

if (
0 == $deltaMax){
$H = 0;
$S = 0;
}
else{
if (
0.5 > $L){
$S = $deltaMax / ($clrMax + $clrMin);
}
else{
$S = $deltaMax / (2 - $clrMax - $clrMin);
}
$deltaR = ((($clrMax - $clrR) / 6) + ($deltaMax / 2)) / $deltaMax;
$deltaG = ((($clrMax - $clrG) / 6) + ($deltaMax / 2)) / $deltaMax;
$deltaB = ((($clrMax - $clrB) / 6) + ($deltaMax / 2)) / $deltaMax;
if (
$clrR == $clrMax){
$H = $deltaB - $deltaG;
}
else if (
$clrG == $clrMax){
$H = (1 / 3) + $deltaR - $deltaB;
}
else if (
$clrB == $clrMax){
$H = (2 / 3) + $deltaG - $deltaR;
}
if (
0 > $H) $H += 1;
if (
1 < $H) $H -= 1;
}
return array(
$H, $S, $L);
}
?>
[email protected]
17 年前
虽然使用以下代码获取像素的 alpha 透明度非常简单直观

<?php
$rgba
= imagecolorsforindex($image, imagecolorat($image, $x, $y));
$alpha = $rgba["alpha"];
?>

但你应该使用 `imagecolorat` 命令的返回值来获取 alpha 透明度,如下面的代码所示,因为它更快,如果你处理图像的每个像素,则会产生重大影响

<?php
$rgba
= imagecolorat($image, $x, $y);
$alpha = ($rgba & 0x7F000000) >> 24;
?>
[email protected]
16 年前
我稍微优化了来自 slepichev 的 rgb2hsl 函数,使其更短,希望也能更快一些

<?php
/**
* 将 RGB 颜色数组转换为 HSL 数组
*
* @param array $ RGB 颜色集,每个颜色分量的范围为 0 到 255
* @return array HSL 集合,每个颜色分量的范围为 0 到 1
*/
function rgb2hsl($rgb){
$clrR = ($rgb[0]);
$clrG = ($rgb[1]);
$clrB = ($rgb[2]);

$clrMin = min($clrR, $clrG, $clrB);
$clrMax = max($clrR, $clrG, $clrB);
$deltaMax = $clrMax - $clrMin;

$L = ($clrMax + $clrMin) / 510;

if (
0 == $deltaMax){
$H = 0;
$S = 0;
}
else{
if (
0.5 > $L){
$S = $deltaMax / ($clrMax + $clrMin);
}
else{
$S = $deltaMax / (510 - $clrMax - $clrMin);
}

if (
$clrMax == $clrR) {
$H = ($clrG - $clrB) / (6.0 * $deltaMax);
}
else if (
$clrMax == $clrG) {
$H = 1/3 + ($clrB - $clrR) / (6.0 * $deltaMax);
}
else {
$H = 2 / 3 + ($clrR - $clrG) / (6.0 * $deltaMax);
}

if (
0 > $H) $H += 1;
if (
1 < $H) $H -= 1;
}
return array(
$H, $S,$L);
}
?>
[email protected]
17 年前
早期的微软褐色示例似乎有一个因素使其呈现粉红色……这是一个修改后的示例,它仅使用微软褐色(根据维基百科的褐色条目)

<?
function imagetosepia(&$img) {
如果 (!($t = imagecolorstotal($img))) {
$t = 256;
imagetruecolortopalette($img, true, $t);
}
$total = imagecolorstotal( $img );
for ( $i = 0; $i < $total; $i++ ) {
$index = imagecolorsforindex( $img, $i );
$red = ( $index["red"] * 0.393 + $index["green"] * 0.769 + $index["blue"] * 0.189 );
$green = ( $index["red"] * 0.349 + $index["green"] * 0.686 + $index["blue"] * 0.168 );
$blue = ( $index["red"] * 0.272 + $index["green"] * 0.534 + $index["blue"] * 0.131 );
if ($red > 255) { $red = 255; }
if ($green > 255) { $green = 255; }
if ($blue > 255) { $blue = 255; }
imagecolorset( $img, $i, $red, $green, $blue );
}
}
?>
admin at phpgfx dot com
17 年前
这是一个使用微软定义的怀旧色滤镜

<?php

function imagesepia( $img ) {
$total = imagecolorstotal( $img );
for (
$i = 0; $i < $total; $i++ ) {
$index = imagecolorsforindex( $img, $i );
$red = ( $index["red"] * 0.393 + $index["green"] * 0.769 + $index["blue"] * 0.189 ) / 1.351;
$green = ( $index["red"] * 0.349 + $index["green"] * 0.686 + $index["blue"] * 0.168 ) / 1.203;
$blue = ( $index["red"] * 0.272 + $index["green"] * 0.534 + $index["blue"] * 0.131 ) / 2.140;
imagecolorset( $img, $i, $red, $green, $blue );
}
}

?>
adspeed.com
19 年前
更正 abasoft dot it 上 m4551 的示例

ImageTrueColorToPalette($im,1,$t);

可能会生成少于 $t 的颜色,因此为了确保安全,for 循环应该调用 “$i<ImageColorsTotal($im)” 而不是 “$i<$t”,否则你会收到警告:颜色索引 [0-9] 超出范围
strozek(a)deas()harvard()edu
20 年前
关于 m4551 的转换方法 - 实际的 CCIR 批准的 RGB 到灰度转换如下

灰度分量 = 0.2125*R + 0.7154*G + 0.0721*B

(参见现代显示器的 CCIR 建议 709)
m4551 at abasoft dot it
20 年前
这是一个将图像转换为灰度级的函数,即使是从真彩色源(jpeg 或 png)转换。

质量略差,但速度很快...

function imagegreyscale(&$img, $dither=1) {
如果 (!($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);
}
}
tim at leethost dot com
17 年前
这是一个更好的灰度、怀旧色和通用色调函数。此函数之所以更好,是因为

1) 可用于真彩色图像(其他怀旧色代码无法使用)。
2) 提供了更好的灰度转换(是的,我说的是“更更好”)。其他灰度代码使用 imagetruecolortopalette,它不适合灰度转换。
3) 其他怀旧色代码颜色过于丰富,对我来说有点过头了。此函数允许您选择性地将灰度的色调设置为所需的任何颜色。
4) 单个函数可用于灰度、怀旧色和任何其他您可以想象的色调。

以下是一些示例

imagegrayscaletint ($img); // 灰度,无色调
imagegrayscaletint ($img,304,242,209); // 我用于怀旧色的色调
imagegrayscaletint ($img,0,0,255); // 浆果蓝图像

色调的 RGB 值通常在 0 到 255 之间。但是,您可以使用大于 255 的值来提亮和“烧蚀”图像。上面的怀旧色示例稍微做到了这一点,下面的示例提供了更好的图像提亮和稍微烧蚀亮区的示例

imagegrayscaletint ($img,400,400,400); // 提亮图像
imagegrayscaletint ($img,127,127,127); // 使图像变暗

<?
function imagegrayscaletint (&$img, $tint_r = 255, $tint_g = 255, $tint_b = 255) {
$width = imagesx($img); $height = imagesy($img);
$dest = imagecreate ($width, $height);
for ($i=0; $i<256; $i++) imagecolorallocate ($dest, $i, $i, $i);
imagecopyresized ($dest, $img, 0, 0, 0, 0, $width, $height, $width, $height);
for ($i = 0; $i < 256; $i++) imagecolorset ($dest, $i, min($i * abs($tint_r) / 255, 255), min($i * abs($tint_g) / 255, 255), min($i * abs($tint_b) / 255, 255));
$img = imagecreate ($width, $height);
imagecopy ($img, $dest, 0, 0, 0, 0, $width, $height);
imagedestroy ($dest);
}
?>
To Top