PHP Conference Japan 2024

imagefilter

(PHP 5, PHP 7, PHP 8)

imagefilter将滤镜应用于图像

描述

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

imagefilter() 将给定的滤镜 filter 应用于 image

参数

image

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

filter

filter 可以是以下之一

  • IMG_FILTER_NEGATE:反转图像的所有颜色。
  • IMG_FILTER_GRAYSCALE:通过将红色、绿色和蓝色分量更改为它们的加权和(使用与 REC.601 亮度 (Y') 计算相同的系数)将图像转换为灰度。alpha 分量将被保留。对于调色板图像,由于调色板限制,结果可能会有所不同。
  • IMG_FILTER_BRIGHTNESS:更改图像的亮度。使用 args 设置亮度级别。亮度范围为 -255 到 255。
  • IMG_FILTER_CONTRAST:更改图像的对比度。使用 args 设置对比度级别。
  • IMG_FILTER_COLORIZE:类似于 IMG_FILTER_GRAYSCALE,但您可以指定颜色。使用 argsarg2arg3 表示 redgreenblue,以及 arg4 表示 alpha 通道。每种颜色的范围为 0 到 255。
  • IMG_FILTER_EDGEDETECT:使用边缘检测突出显示图像中的边缘。
  • IMG_FILTER_EMBOSS:浮雕图像。
  • IMG_FILTER_GAUSSIAN_BLUR:使用高斯方法模糊图像。
  • IMG_FILTER_SELECTIVE_BLUR:模糊图像。
  • IMG_FILTER_MEAN_REMOVAL:使用均值去除实现“素描”效果。
  • IMG_FILTER_SMOOTH:使图像更平滑。使用 args 设置平滑度级别。
  • IMG_FILTER_PIXELATE:对图像应用像素化效果,使用 args 设置块大小,并使用 arg2 设置像素化效果模式。
  • IMG_FILTER_SCATTER:对图像应用散射效果,使用 argsarg2 定义效果强度,此外还可以使用 arg3 仅对选定的像素颜色应用效果。

args

arg2

arg3

arg4

  • IMG_FILTER_COLORIZE:alpha 通道,0 到 127 之间的值。0 表示完全不透明,而 127 表示完全透明。

返回值

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

错误/异常

如果 subplus 会导致 IMG_FILTER_SCATTER filter 溢出/下溢,则抛出 ValueError

变更日志

版本 描述
8.4.0 现在,如果 subplus 会导致 IMG_FILTER_SCATTER filter 溢出/下溢,则抛出 ValueError
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 版本中使用
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 的结果始终是随机的。

参见

添加注释

用户贡献的注释 24 个注释

33
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。
15
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;
}
?>
11
yoann at yoone dot eu
11年前
这是一个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);
}
}
}
?>
7
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 );
?>
4
[email protected]
17 年前
这是一个展示不同滤镜效果的页面
http://www.phpied.com/image-fun-with-php-part-2/
也展示了一些快速制作棕褐色调的方法。
4
[email protected]
12年前
一个创建漂亮晕影效果的函数

<?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.';
}
?>
1
[email protected]
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

我还没有全部测试过,名称本身就说明了它们的功能。
0
[email protected]
10年前
filtertype 是一个整数。因此,如果您想将其用作变量并需要使用例如 preg_match 函数,您可以这样做

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

本手册中 filtertype 的顺序决定了每个滤镜的编号,从 0 到 11。例如,IMG_FILTER_NEGATE=0。
0
martijn(97+1) at gmail dot com (solve math)
12年前
简单的像素化函数,以防你的 PHP 版本低于 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);
}
}
?>
1
fananf at nerdshack dot com
17 年前
如果您正在寻找快速创建棕褐色效果,并且可以用于动态生成缩略图,则不能使用复杂的函数。比 2006 年 1 月 31 日 qudi dot de 网站管理员在笔记中描述的更快更好的方法是在灰度处理后应用着色滤镜。

<?php

(...)

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

(...)

?>

经过几次测试,我使用了 (90,60,40) 来实现我的棕褐色效果,但是,如果您需要更深或更浅的颜色,只需检查最适合您的颜色即可。
0
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]);
}
?>
0
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);
?>
1
vdepizzol at hotmail dot com
20年前
使用 imagefilter() 的示例

<?php
$im
= imagecreatefrompng('dave.png');
if (
$im && imagefilter($im, IMG_FILTER_GRAYSCALE)) {
echo
'图像已转换为灰度。';
imagepng($im, 'dave.png');
} else {
echo
'转换为灰度失败。';
}

imagedestroy($im);
?>

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

<?php
$im
= imagecreatefrompng('sean.png');
if (
$im && imagefilter($im, IMG_FILTER_BRIGHTNESS, 20)) {
echo
'图像亮度已更改.';
imagepng($im, 'sean.png');
} else {
echo
'图像亮度更改失败.';
}

imagedestroy($im);
?>

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

<?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');
} else {
echo
'绿色着色失败.';
}

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

如果图像中只分配了 2 或 3 种颜色,它会在浮雕文本中大量使用背景颜色,这极大地促成了这一点。

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

目前任何源代码公开可用的东西都可能被垃圾邮件发送者攻破,一旦他们中的一个开始与其他垃圾邮件发送者共享代码,但如果您运行至少某种自定义的东西,他们的机器人就会忽略您。
0
webmaster at designsbykosi dot info
17 年前
只有在您拥有 php5 的情况下,此方法才有效。对于 php4,您必须使用 webmaster at qudi dot de 建议的棕褐色功能集。
0
nancy at hypertextdigital dot com
18年前
这个程序正是我一直在寻找的,我希望 Web 管理员用户能够重新着色他们上传的照片(与新闻项目一起使用),无论是蓝色色调还是棕褐色,以匹配网站上使用的其他颜色的外观。

使用包含 RGB 值的选择框的表单,我可以让他们选择两种色调中的任何一种或根本不进行着色,以及动态调整他们图像的查看大小和缩略图图像,而无需使用任何其他图像编辑软件。
0
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);
}
-1
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);
?>
-1
a php user at nowhere dot com
18年前
http://www.hudzilla.org/phpbook/read.php/11_2_15
了解更多详细信息以及一些<i>参数</i>指南。
-1
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 );
-2
santibari at fibertel dot com
18年前
一种保留颜色亮度(即黑色)的着色算法
将输出黑色,白色将输出白色)。
这在 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);
}
//colorize 函数结束
?>
-1
Padde
11年前
我尝试了 IMG_FILTER_SMOOTH 并尝试了一些负值。
结果:

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

-8:图像似乎完全损坏。

-9 及以下:某种锐化效果(-9 比 -10 更锐利)。

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

<?php
//$color 是一个包含 rgb 信息的数组(例如: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);
}
}
?>

希望对大家有所帮助
-3
pedrocandeias@com
13 年前
// 使用透明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);

?>
To Top