imagecopymergegray

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecopymergegray使用灰度复制并合并一部分图像

描述

imagecopymergegray(
    GdImage $dst_image,
    GdImage $src_image,
    int $dst_x,
    int $dst_y,
    int $src_x,
    int $src_y,
    int $src_width,
    int $src_height,
    int $pct
): bool

imagecopymergegray()src_image 的 x/y 坐标 src_xsrc_y 起,以 src_width 的宽度和 src_height 的高度,复制并粘贴到 dst_image 的 x/y 坐标 dst_xdst_y 中。

此函数与 imagecopymerge() 等效,除了在合并时,它通过在复制操作前将目标像素转换为灰度以保留来源的色相。

参数

dst_image

目标图片资源。

src_image

来源图片资源。

dst_x

目标点的 x 坐标。

dst_y

目标点的 y 坐标。

src_x

来源点的 x 坐标。

src_y

来源点的 y 坐标。

src_width

来源宽度。

src_height

来源高度。

pct

将根据 pct 更改 src_image 为灰度,其中 0 为全灰度,100 为不更改。当 pct = 100 时,此函数对调色板图片的行为与 imagecopy() 完全相同(忽略 alpha 成分),而它为真彩色图片实现 alpha 透明度。

返回值

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

变更日志

版本 描述
8.0.0 dst_imagesrc_image 现在需要 GdImage 实例;之前需要 resource

示例

示例 1 imagecopymergegray() 用法

<?php
// 创建图像实例
$dest = imagecreatefromgif('php.gif');
$src = imagecreatefromgif('php.gif');

// 复制并合并 - 灰色 = 20%
imagecopymergegray($dest, $src, 10, 10, 0, 0, 100, 47, 20);

// 输出并从内存中释放
header('Content-Type: image/gif');
imagegif($dest);

imagedestroy($dest);
imagedestroy($src);
?>

添加注释

用户贡献注释 8 则注释

amezghal at msn dot com
16 年前
灰色效果 :)
<?php
header
('content-type:image/png');
$url_img = 'my_image.png';
$img = imagecreatefrompng($url_img);
$x = imagesx($img);
$y = imagesy($img);
$gray_img = imagecreatetruecolor($x, $y);
imagecolorallocate($gray_img, 0, 0, 0);
for (
$i = 0; $i < $x; $i++) {
for (
$j = 0; $j < $y; $j++) {
$rgb = imagecolorat($img, $i, $j);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
//for gray mode $r = $g = $b
$color = max(array($r, $g, $b));
$gray_color = imagecolorexact($new_img, $color, $color, $color);
imagesetpixel($gray_img, $i, $j, $gray_color);
}
}
?>
Mark Barba
18 年前
// 使用我在这里的 php.net 上找到的相同代码,
// 我已经弄清楚了如何将 GIF(或任何其他
// GD 支持的格式)转换为 CIP 格式。CIP 是图像
// Cisco IP 电话的格式... 7905/7940 和 7960
// 型号... 希望有人认为这有用,并让它
// 变得更好...

/////// GIF2CIP PHP 代码 ///////

// 将内存中的图像转换为灰色
$img_width = imageSX($im2);
$img_height = imageSY($im2);

// 转换为灰色
// 注意:这不会影响你的原始图像,除非
// originalFileName 和 destinationFileName 相同
对于 ($y = 0; $y <$img_height; $y++) {
对于 ($x = 0; $x <$img_width; $x++) {
$rgb = imagecolorat($im2, $x, $y);
$red = ($rgb >> 16) & 0xFF;
$green = ($rgb >> 8) & 0xFF;
$blue = $rgb & 0xFF;

$gray = round(.299*$red + .587*$green + .114*$blue);

// 将灰度级向左位移
$grayR = $gray << 16; // R:红色
$grayG = $gray << 8; // G:绿色
$grayB = $gray; // B:蓝色

// OR 运算计算灰度值
$grayColor = $grayR | $grayG | $grayB;

// 设置像素颜色
imagesetpixel ($im2, $x, $y, $grayColor);
imagecolorallocate ($im2, $gray, $gray, $gray);
}
}
/////////////////////////////////////////////////////////

// 将调色板修改为仅限 4 种颜色(7905/7940 和 7960 上的 CIP 图像为 2 位色彩)
ImageTrueColorToPalette2($im2,FALSE,4);

// CIP 图像文件的基本标头...
头 ("内容类型: text/xml");
回显 "<CiscoIPPhoneImage> ";
回显 "<LocationX>-1</LocationX> ";
回显 "<LocationY>-1</LocationY> ";
回显 "<Width>132</Width> ";
回显 "<Height>65</Height> ";
回显 "<Depth>2</Depth> ";
回显 "<Data>";

// 获取图像尺寸(与以上代码几乎相同)
$img_width = imageSX($im2);
$img_height = imageSY($im2);

// 转换为灰色
// 注意:这不会影响你的原始图像,除非
// originalFileName 和 destinationFileName 相同
对于 ($y = 0; $y <$img_height; $y++) {
对于 ($x = 0; $x+4 <$img_width; $x = $x+4)
{
对于 ($ix = 0; $ix < 4; $ix++)
{
$rgb = imagecolorat($im2, $x + $ix, $y);

// 我自己想出了这个翻译
// 肯定会有聪明人会将它完善
如果 ($rgb="2") {$rgb=0;$Gray1[$ix] = $rgb;继续;}
如果 ($rgb="0") {$rgb=2;$Gray1[$ix] = $rgb;继续;}
如果 ($rgb="1") {$rgb=1;$Gray1[$ix] = $rgb;继续;}
如果 ($rgb="3") {$rgb=3;$Gray1[$ix] = $rgb;继续;}
}
$gray1 = $Gray1[0];
$gray2 = $Gray1[1] << 2;
$gray3 = $Gray1[2] << 4;
$gray4 = $Gray1[3] << 6;

// 将 4 个像素打包到一个字节中,用于 CIP 图像
$grey = $gray1 | $gray2 | $gray3 | $gray4;

// CIP 图像数据以十六进制发送,实际上不需要 strtoupper。
$code = strtoupper(dechex($grey));

// 我快速修复了填充单个 HEX 值的问题
如果 (strlen($code)==1) $code = "0".$code;
回显 $code;

}

}
回显 "</Data>";
回显 "<Title>$myvar</Title> ";
回显 "<Prompt>$city</Prompt> ";
回显 "</CiscoIPPhoneImage>";
退出;
switch251 at netcourrier dot com
20 年前
除了 code_couturier 之外:他的代码会生成蓝色的图片,因为他用来设置像素颜色的值(代码不完整:我最初以为应该是 $gray)介于 0 至 255 之间,这对应于蓝色级别。

若要将图片转换成灰色,请使用以下代码

<?php
// replace with your files
$originalFileName = "colorPicture.jpg";
$destinationFileName = "bwPicture.jpg";

// create a copy of the original image
// works with jpg images
// fell free to adapt to other formats ;)
$fullPath = explode(".",$originalFileName);
$lastIndex = sizeof($fullPath) - 1;
$extension = $fullPath[$lastIndex];
if (
preg_match("/jpg|jpeg|JPG|JPEG/", $extension)){
$sourceImage = imagecreatefromjpeg($originalFileName);
}

// get image dimensions
$img_width = imageSX($sourceImage);
$img_height = imageSY($sourceImage);

// convert to grayscale
// note: this will NOT affect your original image, unless
// originalFileName and destinationFileName are the same
for ($y = 0; $y <$img_height; $y++) {
for (
$x = 0; $x <$img_width; $x++) {
$rgb = imagecolorat($sourceImage, $x, $y);
$red = ($rgb >> 16) & 0xFF;
$green = ($rgb >> 8) & 0xFF;
$blue = $rgb & 0xFF;

$gray = round(.299*$red + .587*$green + .114*$blue);

// shift gray level to the left
$grayR = $gray << 16; // R: red
$grayG = $gray << 8; // G: green
$grayB = $gray; // B: blue

// OR operation to compute gray value
$grayColor = $grayR | $grayG | $grayB;

// set the pixel color
imagesetpixel ($sourceImage, $x, $y, $grayColor);
imagecolorallocate ($sourceImage, $gray, $gray, $gray);
}
}

// copy pixel values to new file buffer
$destinationImage = ImageCreateTrueColor($img_width, $img_height);
imagecopy($destinationImage, $sourceImage, 0, 0, 0, 0, $img_width, $img_height);

// create file on disk
imagejpeg($destinationImage, $destinationFileName);

// destroy temp image buffers
imagedestroy($destinationImage);
imagedestroy($sourceImage);
?>

复制粘贴,取代顶部的文件名然后开始(图片文件必须位于与这个脚本相同的文件夹中。如果不是,则你必须自己进行文件管理)
mail at laeubi dot de
20 年前
此功能在我的 trucolerimages 处无法正常运行(尚未尝试其他类型),它只会生成部分灰度图像,并且部分颜色会变得混乱。
我在此处找到了一个解决方法
http://www.phpbuilder.com/columns/cash20030526.php3?page=2

[引用]
GD 库下的高级图像编辑
着色
图像着色非常容易。着色图像的最简单方式非常容易掌握。创建相同尺寸的图像,并使用要更改的颜色填充该图像。然后将此新图像放置在旧图像的上面,使其具有彩色外观。

<?php
function imagecolorize(&$im,&$col,$pct) {
// Get the image's width
$im_w = imagesx($im);
// Get the image's height
$im_h = imagesy($im);
// Set a pixel with the color, so we can get it easily
$setpixel = imagesetpixel($im,$im_w,0,$col);
// Get the color
$index = imagecolorat($im,$im_w,0);
// Find the color in the index
$rgb = imagecolorsforindex($im,$index);
// Get the red value
$r = $rgb["red"];
// Get the green value
$g = $rgb["green"];
// Get the blue value
$b = $rgb["blue"];
// Create the layover
$layover = imagecreate($im_w,$im_h);
// Allocate the color on this image
$color = imagecolorallocate($layover,$r,$g,$b);
// Fill the image with the new color (this really isn't needed)
$fill = imagefill($layover,0,0,$color);
// Merge the layover on top of the older image
$merge = imagecopymerge($im,$layover,0,0,0,0,$im_w,$im_h,$pct);
imagedestroy($layover); // Destroy the layover
}
?>

如果我们使用蓝色覆盖层 RGB(0,0,255),我们得到以下结果
[/引用]

如果你使用黑色或灰色,它不完美,但总比没有好 ;)
szamil at ginf dot pl
17 年前
我稍微修改了 switch251 的代码,这里我们生成了复古效果
<?php
// replace with your files
$originalFileName = $filename;
$destinationFileName = "2".$filename;

// create a copy of the original image
// works with jpg images
// fell free to adapt to other formats ;)
$fullPath = explode(".",$originalFileName);
$lastIndex = sizeof($fullPath) - 1;
$extension = $fullPath[$lastIndex];
if (
preg_match("/jpg|jpeg|JPG|JPEG/", $extension))
{
$sourceImage = imagecreatefromjpeg($originalFileName);
}

// get image dimensions
$img_width = imageSX($sourceImage);
$img_height = imageSY($sourceImage);

// convert to grayscale
// note: this will NOT affect your original image, unless
// originalFileName and destinationFileName are the same
for ($y = 0; $y <$img_height; $y++)
{
for (
$x = 0; $x <$img_width; $x++)
{
$rgb = imagecolorat($sourceImage, $x, $y);
$red = ($rgb >> 16) & 0xFF;
$green = ($rgb >> 8) & 0xFF;
$blue = $rgb & 0xFF;

//sephia
$red2 = min($red*.393 + $green*.769 + $blue*.189,255);
$green2 = min($red*.349 + $green*.686 + $blue*.168,255);
$blue2 = min($red*.272 + $green*.534 + $blue*.131,255);
// shift gray level to the left

$grayR = $red2 << 16; // R: red
$grayG = $green2 << 8 ; // G: green
$grayB = $blue2; // B: blue

// OR operation to compute gray value
$grayColor = $grayR | $grayG | $grayB;


// set the pixel color
imagesetpixel ($sourceImage, $x, $y, $grayColor);
imagecolorallocate ($sourceImage, $gray, $gray, $gray);
}
}

// copy pixel values to new file buffer
$destinationImage = ImageCreateTrueColor($img_width, $img_height);
imagecopy($destinationImage, $sourceImage, 0, 0, 0, 0, $img_width, $img_height);

// create file on disk
imagejpeg($destinationImage, $destinationFileName);

// destroy temp image buffers
imagedestroy($destinationImage);
imagedestroy($sourceImage);
?>
annonymous at example dot com
20 年前
除了 code_couturier - 尝试使用此公式以他的“更精确”的方法计算灰度值(亮度)

$gray = round(.299*$red + .587*$green + .114*$blue);
code_couturier at graffiti dot net
20 年前
# 生成灰度图像的极快方法——
# 从真彩色图像中

#...

# --- 快速灰度图像
对于 ($y = 0; $y <$img_height; $y++) {
对于 ($x = 0; $x <$img_width; $x++) {

# 在这里我们从像素中提取绿色
# 在 x,y 处将其用作灰度值
$gray = (ImageColorAt($image, $x, $y) >> 8) & 0xFF;

# 更精确的方法可能是这样
# $rgb = ImageColorAt($image, $x, $y);
# $red = ($rgb >> 16) & 0xFF;
# $green = (trgb >> 8) & 0xFF;
# $blue = $rgb & 0xFF;
# $gray = (int)(($red+$green+$blue)/4);

# 在此我们将设置新的像素/颜色
imagesetpixel ($image, $x, $y,
ImageColorAllocate ($image, $gray,$gray,$gray));
}
}

# ...
anonymous at domain dot com
14 年前
灰度转换内建于 imagefilter() 中。

<?php
/* 其他代码 */

$image = imagecreatefromjpeg('some.jpg');
imagefilter($image, IMG_FILTER_GRAYSCALE);

/* 其他代码(例如保存) */

imagedestroy($image);

/* 其他代码 */
?>

可以通过以下方法创建复古效果

<?php
/* 其他代码 */

$image = imagecreatefromjpeg('some.jpg');
imagefilter($image, IMG_FILTER_GRAYSCALE);
imagefilter($image, IMG_FILTER_COLORIZE, 112, 66, 20);
// 维基百科中的复古 RGB 定义

/* 其他代码(例如保存) */

imagedestroy($image);

/* 其他代码 */
?>
To Top