imagefilter

(PHP 5, PHP 7, PHP 8)

imagefilter将过滤器应用于图像

描述

imagefilter(GdImage $image, int $filter, array|int|float|bool ...$args): bool

imagefilter()image 上应用给定的过滤器 filter

参数

image

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

filter

filter 可以是以下之一

args

arg2

arg3

arg4

  • IMG_FILTER_COLORIZE: Alpha 通道,A 值介于 0 和 127 之间。0 表示完全不透明,而 127 表示完全透明。

返回值

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

变更日志

版本 描述
8.0.0 image 现在需要一个 GdImage 实例;以前,需要一个有效的 gd resource
7.4.0 添加了散射支持 (IMG_FILTER_SCATTER)。

示例

示例 #1 imagefilter() 灰度示例

<?php
$im
= imagecreatefrompng('dave.png');

if(
$im && imagefilter($im, IMG_FILTER_GRAYSCALE))
{
echo
'图像已转换为灰度。';

imagepng($im, 'dave.png');
}
else
{
echo
'转换为灰度失败。';
}

imagedestroy($im);
?>

示例 #2 imagefilter() 亮度示例

<?php
$im
= imagecreatefrompng('sean.png');

if(
$im && imagefilter($im, IMG_FILTER_BRIGHTNESS, 20))
{
echo
'图像亮度已更改。';

imagepng($im, 'sean.png');
imagedestroy($im);
}
else
{
echo
'更改图像亮度失败。';
}
?>

示例 #3 imagefilter() 着色示例

<?php
$im
= imagecreatefrompng('philip.png');

/* R, G, B,因此 0, 255, 0 为绿色 */
if($im && imagefilter($im, IMG_FILTER_COLORIZE, 0, 255, 0))
{
echo
'图像已成功用绿色阴影。';

imagepng($im, 'philip.png');
imagedestroy($im);
}
else
{
echo
'绿色阴影失败。';
}
?>

示例 #4 imagefilter() 反转示例

<?php
// 定义我们的反转函数,使其适用于没有 imagefilter() 的 php 版本
// php 版本
function negate($im)
{
if(
function_exists('imagefilter'))
{
return
imagefilter($im, IMG_FILTER_NEGATE);
}

for(
$x = 0; $x < imagesx($im); ++$x)
{
for(
$y = 0; $y < imagesy($im); ++$y)
{
$index = imagecolorat($im, $x, $y);
$rgb = imagecolorsforindex($index);
$color = imagecolorallocate($im, 255 - $rgb['red'], 255 - $rgb['green'], 255 - $rgb['blue']);

imagesetpixel($im, $x, $y, $color);
}
}

return(
true);
}

$im = imagecreatefromjpeg('kalle.jpg');

if(
$im && negate($im))
{
echo
'图像已成功转换为负色。';

imagejpeg($im, 'kalle.jpg', 100);
imagedestroy($im);
}
else
{
echo
'转换为负色失败。';
}
?>

示例 #5 imagefilter() 像素化示例

<?php
// 加载 PHP 徽标,我们需要创建两个实例
// 以显示差异
$logo1 = imagecreatefrompng('./php.png');
$logo2 = imagecreatefrompng('./php.png');

// 创建我们要显示的图像实例
// 差异
$output = imagecreatetruecolor(imagesx($logo1) * 2, imagesy($logo1));

// 将像素化应用于每个实例,块大小为
// 大小为 3
imagefilter($logo1, IMG_FILTER_PIXELATE, 3);
imagefilter($logo2, IMG_FILTER_PIXELATE, 3, true);

// 将差异合并到输出图像上
imagecopy($output, $logo1, 0, 0, 0, 0, imagesx($logo1) - 1, imagesy($logo1) - 1);
imagecopy($output, $logo2, imagesx($logo2), 0, 0, 0, imagesx($logo2) - 1, imagesy($logo2) - 1);
imagedestroy($logo1);
imagedestroy($logo2);

// 输出差异
header('Content-Type: image/png');
imagepng($output);
imagedestroy($output);
?>

上面的示例将输出类似于

Output of example : imagefilter() pixelate

示例 #6 imagefilter() 散点示例

<?php
// 加载图像
$logo = imagecreatefrompng('./php.png');

// 将非常柔和的散点效果应用于图像
imagefilter($logo, IMG_FILTER_SCATTER, 3, 5);

// 输出带有散点效果的图像
header('Content-Type: image/png');
imagepng($logo);
imagedestroy($logo);
?>

上面的示例将输出类似于

Output of example : imagefilter() scatter

注意

注意: IMG_FILTER_SCATTER 的结果始终是随机的。

另请参阅

添加一个注释

用户贡献笔记 25 笔记

PanuWorld
17 年前
文档中缺少 ImageFilter() 参数的准确含义和有效范围。根据 5.2.0 源代码,参数是
IMG_FILTER_BRIGHTNESS
-255 = 最低亮度,0 = 不变,+255 = 最高亮度

IMG_FILTER_CONTRAST
-100 = 最大对比度,0 = 不变,+100 = 最低对比度(注意方向!)

IMG_FILTER_COLORIZE
将指定的 RGB 值添加到每个像素(或从每个像素中减去)。每个颜色的有效范围是 -255...+255,而不是 0...255。正确的顺序是红色、绿色、蓝色。
-255 = 最低,0 = 不变,+255 = 最高
这与 IMG_FILTER_GRAYSCALE 关系不大。

IMG_FILTER_SMOOTH
应用一个 9 格卷积矩阵,其中中心像素的权重为 arg1,其他像素的权重为 1.0。结果通过用 arg1 + 8.0(矩阵的总和)除以总和进行归一化。
接受任何浮点数,大值(实际上:2048 或更大)= 不变

如果参数超出所选过滤器的范围,则 ImageFilter 似乎返回 false。
martijn at martijnfrazer dot nl
10 年前
我今天需要一个特别强的模糊效果,很难用内置的 IMG_FILTER_GAUSSIAN_BLUR 过滤器获得足够的结果。为了达到我需要的模糊强度,我不得不重复过滤器多达 100 次,这花费了太长的时间,无法接受。

搜索了一番后,我发现这个答案对这个问题来说是一个相当好的解决方案:http://stackoverflow.com/a/20264482

基于这种技术,我编写了以下通用函数来在合理的时间内实现非常强的模糊效果

<?php

/**
* 强力模糊
*
* @param resource $gdImageResource
* @param int $blurFactor 可选
* 这是模糊的强度
* 0 = 无模糊,3 = 默认,超过 5 会非常模糊
* @return GD 图像资源
* @author Martijn Frazer,想法来自 http://stackoverflow.com/a/20264482
*/
function blur($gdImageResource, $blurFactor = 3)
{
// blurFactor 必须是整数
$blurFactor = round($blurFactor);

$originalWidth = imagesx($gdImageResource);
$originalHeight = imagesy($gdImageResource);

$smallestWidth = ceil($originalWidth * pow(0.5, $blurFactor));
$smallestHeight = ceil($originalHeight * pow(0.5, $blurFactor));

// 第一次运行,之前图像为原始输入
$prevImage = $gdImageResource;
$prevWidth = $originalWidth;
$prevHeight = $originalHeight;

// 缩小比例,并逐步放大,模糊整个过程
for($i = 0; $i < $blurFactor; $i += 1)
{
// 确定下一张图片的尺寸
$nextWidth = $smallestWidth * pow(2, $i);
$nextHeight = $smallestHeight * pow(2, $i);

// 将前一张图片调整为下一尺寸
$nextImage = imagecreatetruecolor($nextWidth, $nextHeight);
imagecopyresized($nextImage, $prevImage, 0, 0, 0, 0,
$nextWidth, $nextHeight, $prevWidth, $prevHeight);

// 应用模糊过滤器
imagefilter($nextImage, IMG_FILTER_GAUSSIAN_BLUR);

// 现在新图片成为下一步的旧图片
$prevImage = $nextImage;
$prevWidth = $nextWidth;
$prevHeight = $nextHeight;
}

// 缩放回原始大小,再次模糊
imagecopyresized($gdImageResource, $nextImage,
0, 0, 0, 0, $originalWidth, $originalHeight, $nextWidth, $nextHeight);
imagefilter($gdImageResource, IMG_FILTER_GAUSSIAN_BLUR);

// 清理
imagedestroy($prevImage);

// 返回结果
return $gdImageResource;
}
?>
yoann at yoone dot eu
10 年前
这是 IMG_FILTER_COLORIZE 过滤器的替代方案,但它考虑了每个像素的 alpha 参数。

<?php
function rgba_colorize($img, $color)
{
imagesavealpha($img, true);
imagealphablending($img, true);

$img_x = imagesx($img);
$img_y = imagesy($img);
for (
$x = 0; $x < $img_x; ++$x)
{
for (
$y = 0; $y < $img_y; ++$y)
{
$rgba = imagecolorsforindex($img, imagecolorat($img, $x, $y));
$color_alpha = imagecolorallocatealpha($img, $color[0], $color[1], $color[2], $rgba['alpha']);
imagesetpixel($img, $x, $y, $color_alpha);
imagecolordeallocate($img, $color_alpha);
}
}
}
?>
aiden dot mail at freemail dot hu
16 年前
用于动态更改 PNG 图像透明度的函数。仅适用于 PNG,并且浏览器需要支持 alpha 通道。
该函数拉伸图像的透明度范围,以便最不透明的像素将设置为给定的透明度。(像素中的其他透明度值会相应地修改。)
返回成功或失败。

<?php
function filter_opacity( &$img, $opacity ) //参数:图像资源 ID,不透明度百分比(例如 80)
{
if( !isset(
$opacity ) )
{ return
false; }
$opacity /= 100;

//获取图像宽度和高度
$w = imagesx( $img );
$h = imagesy( $img );

//关闭 alpha 混合
imagealphablending( $img, false );

//查找图像中最不透明的像素(具有最小 alpha 值的像素)
$minalpha = 127;
for(
$x = 0; $x < $w; $x++ )
for(
$y = 0; $y < $h; $y++ )
{
$alpha = ( imagecolorat( $img, $x, $y ) >> 24 ) & 0xFF;
if(
$alpha < $minalpha )
{
$minalpha = $alpha; }
}

//遍历图像像素并修改每个像素的 alpha 值
for( $x = 0; $x < $w; $x++ )
{
for(
$y = 0; $y < $h; $y++ )
{
//获取当前 alpha 值(表示透明度!)
$colorxy = imagecolorat( $img, $x, $y );
$alpha = ( $colorxy >> 24 ) & 0xFF;
//计算新的 alpha 值
if( $minalpha !== 127 )
{
$alpha = 127 + 127 * $opacity * ( $alpha - 127 ) / ( 127 - $minalpha ); }
else
{
$alpha += 127 * $opacity; }
//获取具有新 alpha 值的颜色索引
$alphacolorxy = imagecolorallocatealpha( $img, ( $colorxy >> 16 ) & 0xFF, ( $colorxy >> 8 ) & 0xFF, $colorxy & 0xFF, $alpha );
//使用新的颜色+不透明度设置像素
if( !imagesetpixel( $img, $x, $y, $alphacolorxy ) )
{ return
false; }
}
}
return
true;
}
?>

使用示例

<?php
$image
= imagecreatefrompng( "img.png" );
filter_opacity( $image, 75 );
header( "content-type: image/png" );
imagepng( $image );
imagedestroy( $image );
?>
ssttoo at gmail dot com
16 年前
以下页面展示了不同滤镜的效果
http://www.phpied.com/image-fun-with-php-part-2/
还展示了一些快速实现棕褐色的方法。
cookie at backbone dot sk
11 年前
一个创建漂亮渐晕效果的函数

<?php

function vignette($im){
global
$width, $height;
$width = imagesx($im);
$height = imagesy($im);

function
effect($x, $y, &$rgb){
global
$width, $height;

$sharp = 0.4; // 0 - 10 越小越锐利,
$level = 0.7; // 0 - 1 越小越亮

$l = sin(M_PI / $width * $x) * sin(M_PI / $height * $y);
$l = pow($l, $sharp);

$l = 1 - $level * (1 - $l);

$rgb['red'] *= $l;
$rgb['green'] *= $l;
$rgb['blue'] *= $l;
}

for(
$x = 0; $x < imagesx($im); ++$x){
for(
$y = 0; $y < imagesy($im); ++$y){
$index = imagecolorat($im, $x, $y);
$rgb = imagecolorsforindex($im, $index);
effect($x, $y, $rgb);
$color = imagecolorallocate($im, $rgb['red'], $rgb['green'], $rgb['blue']);

imagesetpixel($im, $x, $y, $color);
}
}
return(
true);
}

$im = imagecreatefromjpeg('cars7_134.jpg');

if(
$im and vignette($im)){
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
}else{
echo
'Vignette failed.';
}
?>
kees at tweakers dot net
20 年前
从我对这个函数的了解来看,它接受以下参数
IMG_FILTER_NEGATE
IMG_FILTER_GRAYSCALE
IMG_FILTER_EDGEDETECT
IMG_FILTER_GAUSSIAN_BLUR
IMG_FILTER_SELECTIVE_BLUR
IMG_FILTER_EMBOSS
IMG_FILTER_MEAN_REMOVAL

以下参数需要一个或多个参数。
IMG_FILTER_SMOOTH, -1924.124
IMG_FILTER_COLORIZE, -127.12, -127.98, 127
IMG_FILTER_CONTRAST, -90
IMG_FILTER_BRIGHTNESS, 98

我还没有全部测试过,名字就很能说明问题了。
shahilahmed4242 at gmail dot com
8 年前
PHP 棕褐色效果

$myImage = imagecreatefromjpeg($f);
imagefilter($myImage,IMG_FILTER_GRAYSCALE);
imagefilter($myImage,IMG_FILTER_BRIGHTNESS,-30);
imagefilter($myImage,IMG_FILTER_COLORIZE, 90, 55, 30);
header("Content-type: image/jpeg");
imagejpeg($myImage );
imagejpeg($myImage,$f);
imagedestroy( $myImage );
Manolo at msalsas dot com
10 年前
filtertype 是一个整数。因此,如果您想将其用作变量,并且需要使用例如 preg_match 函数,您可以通过以下方式实现。

<?php
$filter
= IMG_FILTER_BRIGHTNESS;
if(
preg_match( '/^[0-9]{1,2}$/', $filter ) )
{
//执行某些操作
}
?>

本手册中 filtertype 的顺序决定了每个过滤器的编号,从 0 到 11。例如 IMG_FILTER_NEGATE=0。
martijn(97+1) at gmail dot com (solve math)
11 年前
简单的像素化函数,以备不时之需,如果你 < 5.3

<?php
function pixelate(&$image, $pixelsize){
$maxX = imagesx($image);
$maxY = imagesy($image);
$rad=floor($pixelsize/2);
for(
$x=$rad;$x<$maxX;$x+=$pixelsize)
for(
$y=$rad;$y<$maxY;$y+=$pixelsize){
$color = imagecolorat($image, $x, $y);
imagefilledrectangle ($image, $x-$rad, $y-$rad, $x+$pixelsize-1, $y+$pixelsize-1,$color);
}
}
?>
hadrien dot jouet at grownseed dot net
13 年前
对于想要在图像上应用“叠加”效果的人来说(就像 Photoshop 中那样,通常是黑白图像),您可以使用 IMG_FILTER_COLORIZE 过滤器来实现。

<?php
function multiplyColor(&$im, $color = array(255, 0, 0))
{
//获取相反颜色
$opposite = array(255 - $color[0], 255 - $color[1], 255 - $color[2]);

//现在我们将相反颜色从图像中减去
imagefilter($im, IMG_FILTER_COLORIZE, -$opposite[0], -$opposite[1], -$opposite[2]);
}
?>
bushmakin stas (bushstas at mail dot ru)
13 年前
一个函数,使所有颜色变为灰色,除了唯一的颜色
我自己写的,所以代码可能不太美观)

<?php
function imagecolorfilter($im){

$height = imagesy($im);
$width = imagesx($im);
for(
$x=0; $x<$width; $x++){
for(
$y=0; $y<$height; $y++){
$rgb = ImageColorAt($im, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$c=($r+$g+$b)/3;

//if($g<$r || $g<$b+20){$r=$c;$g=$c; $b=$c;}//只保留绿色
//if($b<$r || $b<$g){$r=$c;$g=$c; $b=$c;}//只保留蓝色
if($r<$g+30 || $r<$b){$r=$c;$g=$c; $b=$c;}//只保留红色
//if($r<$g-1 || $r>$g+60 || $b>$g-50){$r=$c;$g=$c; $b=$c;}//只保留黄色


imagesetpixel($im, $x, $y,imagecolorallocate($im, $r,$g,$b));
}
}
}

header ("Content-type: image/jpeg");
$im = imagecreatefromjpeg("image.jpg");
imagecolorfilter($im);
imagejpeg($im);
?>
fananf at nerdshack dot com
17 年前
如果您正在寻找可以用于动态生成缩略图的快速褐色效果,则无法使用复杂的函数。比 webmaster at qudi dot de 在 2006 年 1 月 31 日的笔记中所述更快、更好的方法是在灰度化之后应用颜色化过滤器。

<?php

(...)

imagefilter($yourimage, IMG_FILTER_GRAYSCALE); imagefilter($yourimage, IMG_FILTER_COLORIZE, 90, 60, 40);

(...)

?>

我在多次测试后使用了 (90,60,40) 来获得褐色效果,但是,如果您需要更深或更浅的颜色,请检查最适合您的颜色。
vdepizzol at hotmail dot com
19 年前
使用 imagefilter() 的示例

<?php
$im
= imagecreatefrompng('dave.png');
if (
$im && imagefilter($im, IMG_FILTER_GRAYSCALE)) {
echo
'Image converted to grayscale.';
imagepng($im, 'dave.png');
} else {
echo
'Conversion to grayscale failed.';
}

imagedestroy($im);
?>

/////////////////////////////

<?php
$im
= imagecreatefrompng('sean.png');
if (
$im && imagefilter($im, IMG_FILTER_BRIGHTNESS, 20)) {
echo
'Image brightness changed.';
imagepng($im, 'sean.png');
} else {
echo
'Image brightness change failed.';
}

imagedestroy($im);
?>

/////////////////////////////

<?php
$im
= imagecreatefrompng('philip.png');

/* R, G, B,所以 0, 255, 0 是绿色 */
if ($im && imagefilter($im, IMG_FILTER_COLORIZE, 0, 255, 0)) {
echo
'Image successfully shaded green.';
imagepng($im, 'philip.png');
} else {
echo
'Green shading failed.';
}

imagedestroy($im);
?>
michaeln no at spam associationsplus ca
16 年前
注意:将 IMG_FILTER_EMBOSS 应用于文本并在 phpBB 或您自己的项目中使用的自定义脚本中使用,是阻止 OCR 机器人通过的一种非常好的方法。对于人眼来说,浮雕衬线字体很容易理解,但对于 OCR 脚本来说却非常困难,因为它似乎给了它一种 3D 的错觉。

如果您只在图像中分配 2 或 3 种颜色,它会在浮雕文本中大量使用背景颜色,这会极大地助长这种错觉。

我创建了自己的自定义 CAPTCHA 脚本,以阻止我为一个客户网站开发的 phpBB 帖子垃圾邮件,我从每天创建 2-3 个新垃圾邮件用户减少到了零。

任何目前在互联网上公开提供源代码的东西都有可能被垃圾邮件发送者攻破,一旦其中一个开始与其他垃圾邮件发送者共享代码。但是,如果您运行的是至少是部分自定义的内容,它们的机器人会绕过您。
webmaster at designsbykosi dot info
17 年前
这只有在你拥有 php5 的情况下才有效。对于 php4,你必须使用 sepia 函数,正如 qudi dot de 的网站管理员所建议的那样。
nancy at hypertextdigital dot com
18 年前
这个例程正是我想要的,我希望网站管理员能够重新着色他们上传的照片(以配合新闻项目),可以选择蓝色色调或棕褐色,以匹配网站上使用的其他颜色的外观。

使用带有包含 RGB 值的下拉框的表单,我可以让他们选择两种色调中的任何一种或完全不进行着色,此外还可以动态调整图像大小以适应查看尺寸,并生成缩略图,而无需使用任何其他图像编辑软件。
webmaster at qudi dot de
18 年前
为了快速获得看起来不错的棕褐色效果(在 php4 中也可以),我只使用了这个小家伙,因为真正的棕褐色实现太慢了。

function pseudosepia(&$im,$percent){
$sx=imagesx($im);
$sy=imagesy($im);
$filter=imagecreatetruecolor($sx,$sy);
$c=imagecolorallocate($filter,100,50,50);
imagefilledrectangle($filter,0,0,$sx,$sy,$c);
imagecopymerge($im,$filter,0,0,0,0,$sx,$sy,$percent);
}
mail at kavisiegel dot com
15 年前
寻找一种简单更改图像颜色的方法,我尝试了 IMG_FILTER_COLORIZE。我无法获得我想要的高质量结果。事实证明,PHP 的 Colorize 等同于 Photoshop 的“线性减淡”图层过滤器。

色调调整一直对我来说效果很好,所以我认为我可以尝试使用 PHP。
这个函数在较大的图像上有点慢,但在像我使用的这种小图像上,差别微不足道。

该脚本计算提供的颜色中红色、绿色和蓝色的比例,然后相应地缩放图像... 不幸的是,它是逐像素进行的。

这是一个演示,将这个函数、Photoshop 的色调函数和 PHP 的 colorize 函数进行比较。 http://img146.imageshack.us/img146/3167/imagefilterhuedemo.png

<?php
function imagefilterhue($im,$r,$g,$b){
$rgb = $r+$g+$b;
$col = array($r/$rgb,$b/$rgb,$g/$rgb);
$height = imagesy($im);
$width = imagesx($im);
for(
$x=0; $x<$width; $x++){
for(
$y=0; $y<$height; $y++){
$rgb = ImageColorAt($im, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$newR = $r*$col[0] + $g*$col[1] + $b*$col[2];
$newG = $r*$col[2] + $g*$col[0] + $b*$col[1];
$newB = $r*$col[1] + $g*$col[2] + $b*$col[0];
imagesetpixel($im, $x, $y,imagecolorallocate($im, $newR, $newG, $newB));
}
}
}
header ("Content-type: image/jpeg");
$im = imagecreatefromjpeg("test.jpg");

// 用法:与 imagefilter() 相同,只是没有 filtertype。
// imagefilterhue(resource $image, int $red, int $green , int $blue)
imagefilterhue($im,2,70,188);

// 与 colorize 等效,在演示图像中测试:imagefilter($im, IMG_FILTER_COLORIZE, 2, 70, 188);

imagejpeg($im);
?>
a php user at nowhere dot com
18 年前
http://www.hudzilla.org/phpbook/read.php/11_2_15
有关更详细的信息以及一些 <i>arg</i> 指南。
santibari at fibertel dot com
18 年前
一种保留颜色亮度(即黑色)的 colorize 算法
将输出黑色,白色将输出白色。
这在 PHP4 中有效,非常适合动态自定义界面。
动态地。

<?php
function colorize($img_src,$img_dest, $r, $g, $b)
{
if(!
$im = imagecreatefromgif($img_src))
return
"无法使用图像 $img_src";

//我们将根据输入颜色创建单色调色板
//该调色板从黑色到白色渐变
//输入颜色亮度:这等同于
//输入颜色在单色调色板中的位置
$lum_inp=round(255*($r+$g+$b)/765); //765=255*3

//我们将输入颜色填充到调色板条目中,在对应的
//位置上

$pal[$lum_inp]['r']=$r;
$pal[$lum_inp]['g']=$g;
$pal[$lum_inp]['b']=$b;

//现在我们完成调色板,首先是黑色,然后是白色

//从输入到黑色
//===================
//黑色和输入之间有多少颜色
$steps_to_black=$lum_inp;

//每个组件的步长
if($steps_to_black)
{
$step_size_red=$r/$steps_to_black;
$step_size_green=$g/$steps_to_black;
$step_size_blue=$b/$steps_to_black;
}

for(
$i=$steps_to_black;$i>=0;$i--)
{
$pal[$steps_to_black-$i]['r']=$r-round($step_size_red*$i);
$pal[$steps_to_black-$i]['g']=$g-round($step_size_green*$i);
$pal[$steps_to_black-$i]['b']=$b-round($step_size_blue*$i);
}

//从输入到白色:
//===================
//输入和白色之间有多少颜色
$steps_to_white=255-$lum_inp;

if(
$steps_to_white)
{
$step_size_red=(255-$r)/$steps_to_white;
$step_size_green=(255-$g)/$steps_to_white;
$step_size_blue=(255-$b)/$steps_to_white;
}
else
$step_size_red=$step_size_green=$step_size_blue=0;

//每个组件的步长
for($i=($lum_inp+1);$i<=255;$i++)
{
$pal[$i]['r']=$r + round($step_size_red*($i-$lum_inp));
$pal[$i]['g']=$g + round($step_size_green*($i-$lum_inp));
$pal[$i]['b']=$b + round($step_size_blue*($i-$lum_inp));
}
//--- 调色板创建结束

//现在,让我们将原始调色板更改为我们创建的调色板
for($c = 0; $c < $palette_size; $c++)
{
$col = imagecolorsforindex($im, $c);
$lum_src=round(255*($col['red']+$col['green']
+
$col['blue'])/765);
$col_out=$pal[$lum_src];
imagecolorset($im, $c, $col_out['r'],
$col_out['g'],
$col_out['b']);
}

//保存图像文件
imagepng($im,$img_dest);
imagedestroy($im);
}
//end function colorize
?>
Padde
11 年前
我尝试了 IMG_FILTER_SMOOTH 并尝试了一些负数
值。

-1 到 -7:看起来像是平滑和边缘检测的混合

-8:图像似乎完全损坏

-9 及更低:有点锐化效果(-9 比 -10 更锐利)

我认为,特别是锐化效果可能很有用。
jonathan dot gotti at gmail dot com
13 年前
IMG_FILTER_COLORIZE 似乎不适用于调色板图像,以下是一种使用调色板图像实现相同结果的方法

<?php
//$color 是一个包含 rvb 信息的数组(例如:array(255,80,0))
function paletteColorize($imgResource,array $color){
$nbColors = imagecolorstotal($imgResource);
for(
$i=0; $i<$nbColors; $i++){
$c = array_values(imagecolorsforindex($imgRes,$i));
for(
$y=0;$y<3;$y++)
$c[$y] = max(0,min(255,$c[$y]+$color[$y]));
imagecolorset($imgResource,$i,$c[0],$c[1],$c[2]);
}
}
?>

以下是一个适用于真彩色和调色板图像的函数,它尝试使用给定的颜色执行类似于灰度化的操作
<?php
function colorScale($imgRes,array $color){
imagefilter($imgRes,IMG_FILTER_GRAYSCALE);
$color = self::_read_color($color);
$luminance=($color[0]+$color[1]+$color[2])/3; // 颜色带来的平均亮度
$brightnessCorrection = $luminance/3; // 每个通道需要校正的亮度量
if( $luminance < 127 ){
$brightnessCorrection -= 127/3; // 颜色较暗,因此我们需要否定亮度校正
}
if(!
imageistruecolor($imgRes) ){
$nbColors = imagecolorstotal($imgRes);
for(
$i=0; $i<$nbColors; $i++){
$c = array_values(imgagecolorsforindex($imgRes,$i));
for(
$y=0;$y<3;$y++){
$c[$y] = max(0, min(255, $c[$y] + ($color[$y]-$luminance) + $brightnessCorrection) ); // 括号只是为了更好地理解
}
imagecolorset($omgRes,$i,$c[0],$c[1],$c[2]);
}
}else{
// 使用真彩色更容易
imagefilter($imgRes, IMG_FILTER_COLORIZE, $color[0]-$luminance, $color[1]-$luminance, $color[2]-$luminance);
imagefilter($imgRes, IMG_FILTER_BRIGHTNESS, $brightnessCorrection);
}
}
?>

希望有人会发现这有用
mail at pedrocandeias dot com
12 年前
// 使用透明 PNG 文件,可以给“正”项着色,并将透明部分保持原样 - 测试代码

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

$im = imagecreatefrompng('image.png');
$width = imagesx($im);
$height = imagesy($im);
$imn = imagecreatetruecolor($width, $height);
imagealphablending($imn,false);
$col=imagecolorallocatealpha($imn,255,255,255,127);
imagesavealpha($imn,true);
imagefilledrectangle($imn,0,0,$width,$height,$col);
imagealphablending($imn,true);
imagecopy($imn, $im, 0, 0, 0, 0, $width, $height);
imagefilter($imn, IMG_FILTER_NEGATE);

// 对于包含内容的透明 PNG 文件,可以在此处更改颜色:我使用的是 RGB:0,255,0
imagefilter($imn, IMG_FILTER_COLORIZE, 0, 255, 0);

imagepng($imn);
imagedestroy($imn);

?>
trucex email over at gmail
17 年前
看起来 imagefilter 与 apha 不兼容。如果对透明图像运行 imagefilter,它将返回一个黑色图像...类似于许多 Photoshop 插件的行为。
To Top