PHP Conference Japan 2024

Imagick::charcoalImage

(PECL imagick 2, PECL imagick 3)

Imagick::charcoalImage模拟炭笔画效果

描述

public Imagick::charcoalImage(float $radius, float $sigma): bool

模拟炭笔画效果。

参数

radius

高斯模糊的半径,以像素为单位,不包括中心像素

sigma

高斯的标准差,以像素为单位

返回值

成功时返回 true

示例

示例 #1 Imagick::charcoalImage()

<?php
function charcoalImage($imagePath, $radius, $sigma) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->charcoalImage($radius, $sigma);
header("Content-Type: image/jpg");
echo
$imagick->getImageBlob();
}

?>

添加注释

用户贡献的注释 1 条注释

4
holdoffhunger at gmail dot com
12 年前
此函数的参数确实令人费解。高斯半径和高斯标准差?试用了一段时间后,我认为我理解了。高斯是“笔刷”(用Gimp/Photoshop的行话),半径只是笔刷的半径,标准差是笔刷印记大小的变化程度。$radius参数可以是0到任何你能想到的大数,但是一旦你超过10、20或30像素(取决于图像大小),整个图像就会模糊到无法使用的程度。$sigma作为标准差,应该小于你的半径才能获得理想的效果。可以把它理解为“$radius像素大小的炭笔笔刷,每个笔刷比$radius像素大或小$sigma像素”。

对于一张平均500 x 500像素的图像,你可能需要一个3到5的$radius和一个1到3的$sigma,但是在你使图像模糊到无法辨认之前,你通常可以达到10像素。(目前,对于我正在处理的这张400x400的图像,$radius: 5 / $sigma: 2 是完美的融合。)

这个项目的官方文档网站也没有太多帮助:https://imagemagick.org.cn/RMagick/doc/image1.html。那里的作者指出:“您可以通过更改半径和sigma参数来改变效果的强度。”因此,我在这里对功能的描述主要基于经验而不是文档,而文档很难找到。

以下是将效果应用于图像的完整代码。此代码将打开指定的文件,将charcoalImage效果应用于它,然后将其保存到另一个指定的文件。参数通过POST数据提供,ImageMagick类的唯一使用的函数是readImageFile、charcoalImage和writeImageFile,如下所示

<?php

// 作者:[email protected]

// 获取传入数据 -- 函数参数
// --------------------------------------------------

$inbound_gaussian_radius = $_POST['radius_of_gaussian'];
$inbound_standard_deviation = $_POST['standard_deviation_of_gaussian'];

// 获取传入数据 -- 读取文件和写入文件
// --------------------------------------------------

$filename_for_function = $_POST['file_target'];
$inbound_save_as_filename = $_POST['saveable_result_file'];

// 获取图像文件数据
// ---------------------------------------------

$folder_location = "images/workshop/";
$file_to_grab_with_location = $folder_location . $filename_for_function;

$imagick_type = new Imagick();

// 打开文件
// ---------------------------------------------

$file_handle_for_viewing_image_file = fopen($file_to_grab_with_location, 'a+');

// 读取文件
// ---------------------------------------------

$imagick_type->readImageFile($file_handle_for_viewing_image_file);

// 执行函数
// ---------------------------------------------

$imagick_type->charcoalImage($inbound_gaussian_radius, $inbound_standard_deviation);

// 保存文件
// ---------------------------------------------

$folder_location = "images/workshop/";
$file_to_grab_with_location = $folder_location . $inbound_save_as_filename;

$file_handle_for_saving_image_file = fopen($file_to_grab_with_location, 'a+');

// 写入文件
// ---------------------------------------------

$imagick_type->writeImageFile($file_handle_for_saving_image_file);

?>
To Top