使用 PHP 去饱和图像
去饱和图像意味着从中删除所有非灰度颜色,基本上创建一个黑白版本。为此,您可以使用函数imagecopymergegray(),它是GD图像库的一部分。这个函数有点难以理解,但它的作用是将一个图像采样到另一个图像中,并有选择地改变采样过程中保留的颜色数量。该函数可以只对图像的一部分或整个事物进行采样。该函数的参数如下。
$dest-目标图像链接资源。
$source-源图像链接资源。
$dest_x-目标图像中的x坐标以放置复制的灰度样本。
$dest_y-目标图像中放置复制灰度样本的y坐标。
$source_x-要从中复制灰度样本的源图像中的x坐标。
$source_y-要从中复制灰度样本的源图像中的y坐标。
$source_width-源图像中采样部分的宽度。
$source_height-源图像中采样部分的高度。
$pct-要复制到目标图像中的颜色百分比。这里的0表示完全灰度,100表示不变。
下面的代码片段将获取一个彩色图像(称为mycolourimage.jpg)并将其转换为灰度版本,然后将其保存到一个新文件(在本例中为mygreyscaleimage.png)。
//创建图像实例 $src = imagecreatefromjpeg('mycolourimage.jpg'); $dest = imagecreatefromjpeg('mycolourimage.jpg'); //灰度操作 imagecopymergegray($dest, $src, 0, 0, 0, 0, imagesx($src), imagesy($src), 0); //保存灰度图像文件 imagePNG($dest, 'mygreyscaleimage.png', 0); //从内存中删除原始图像。 imagedestroy($dest); imagedestroy($src);
您可能会注意到,在上面的代码中,我们两次打开初始图像文件。这样函数就可以有一个源文件和一个目标文件来工作。作为测试,我尝试使用创建图像,imagecreatetruecolor()但这在创建真正的灰度图像时不起作用。打开两个图像的替代方法是打开一次并将其用作源和目标资源两次。因此,上面的代码可以简化为以下代码。
$src = imagecreatefromjpeg('mycolourimage.jpg'); imagecopymergegray($src, $src, 0, 0, 0, 0, imagesx($src), imagesy($src), 0); imagePNG($src, 'mygreyscaleimage.png', 0); imagedestroy($src);
创建灰度图像的另一种(并且更简单)机制是使用该imagefilter()函数并将常量IMG_FILTER_GRAYSCALE作为参数传递。下面的代码片段展示了这个机制的作用。
$image = imagecreatefromjpeg('mycolourimage.jpg'); imagefilter($image, IMG_FILTER_GRAYSCALE); //保存图像。 imagePNG($image, 'mygreyscaleimage.png', 0); imagedestroy($image);
我最近在一个WordPress网站中实际使用了这段代码,它获取了帖子的特色图片并将其转换为灰度。这是一种特殊的灰度到褪色效果,但它需要在需要时创建灰度图像,因此是上述代码实际应用的一个很好的例子。下面的大部分代码片段都涉及找出图像文件的文件名并确保它在可能昂贵的图像处理之前不存在。另一个主要区别是我们使用wp_load_image(),而不是加载图像imagecreatefromjpeg()。这是因为WordPress功能可以识别文件格式,并将使用相关功能来创建图像资源。
$post_id = $post->ID; //获取缩略图ID $post_thumbnail_id = get_post_thumbnail_id($post_id); //查找缩略图位置 $image_src = wp_get_attachment_image_src($post_thumbnail_id, 'thumbnail'); $image_src_path = dirname($image_src[0]); $image_src_filename = basename($image_src[0]); //创建灰度文件名 $image_src_extention_loc = (strripos($image_src_filename, '.') - strlen($image_src_filename)); $bw_image_filename = substr($image_src_filename, 0, $image_src_extention_loc) . '_bw' . substr($image_src_filename, $image_src_extention_loc); //获取图片的本地路径 $wpcontent_image_path = dirname(get_attached_file($post_thumbnail_id)); if (!file_exists($wpcontent_image_path . '/' . $bw_image_filename)) { //创建灰度图像 $bw_image = wp_load_image($wpcontent_image_path . '/' . $image_src_filename); //应用灰度滤镜 imagefilter($bw_image, IMG_FILTER_GRAYSCALE); //保存图像。 imagejpeg($bw_image, $wpcontent_image_path . '/' . $bw_image_filename, 100); imagedestroy($bw_image); } echo ''; echo '';
上面的代码将打印出彩色图像,然后是灰度图像,并且应该进入模板文件的循环部分。