此函数的参数非常吓人。高斯函数的半径和标准差?玩了一会儿之后,我认为我理解了。高斯函数就是“画笔”(在 Gimp/Photoshop 中),半径只是画笔的半径,标准差是画笔印记尺寸变化的程度。$radius 参数可以是 0 到你能想到的任何大数字,但一旦你超过 10、20 或 30 像素(取决于图像大小),整个图像就会模糊到无法识别。$sigma 作为标准差,应该小于你的半径才能获得所需的效果。把它想象成“$radius 像素大小的炭笔画笔,每支画笔的大小比 $radius 大或小 $sigma 像素”。
对于一个平均 500 x 500 像素的图像,你可能想要 $radius 为 3 到 5,$sigma 为 1 到 3,但你通常可以一直使用到 10 像素,然后图像就会模糊到无法识别。(目前,$radius: 5 / $sigma: 2 是我现在正在处理的这个 400x400 图像的完美融合。)
官方文档网站对这个项目也没有太多帮助: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);
?>