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
ssttoo@gmail.com
17 年前
這是一個展示不同濾鏡效果的頁面
http://www.phpied.com/image-fun-with-php-part-2/
也展示了一些快速製作棕褐色調的方法。
4
cookie@backbone.sk
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
kees@tweakers.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

我還沒有全部測試過,名稱本身就說明了它們的功能。
0
Manolo@msalsas.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。
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