PHP : Convert dynamic uploaded image to specific color(动态颜色)
PHP : Convert dynamic uploaded image to specific color(dynamic color)
我有一个简单的 HTML
表单,用户可以在其中上传他们的图片,我需要借助 PHP
将上传的图片转换为特定颜色
比如用户上传了一些图片我需要将整张图片转换成特定的颜色(这个颜色是动态的)
是否有任何 PHPGD
库可以帮助我实现这一目标?
编辑
比如用户正在上传这种图片,
然后我需要转换成以下类型的图像,
你需要像 Imagick
. To replace some color, you need clutImage
这样的库
$image = new Imagick('test.jpg');
$clut = new Imagick();
$clut->newImage(1, 1, new ImagickPixel('rgb(255, 0, 0)'));
$image->clutImage($clut);
$image->writeImage('test_out.jpg');
我仍然不确定你到底想做什么,但我认为以下其中一项可能很接近。也许你可以在终端中尝试它们,直到我们最终找出正确的操作,然后我们才有希望将它们翻译成 PHP。这是 ImageMagick v7 语法:
magick image.png -channel RGB -colorspace gray +level-colors red, result.png
或者这样:
magick image.png -fill red +opaque white result2.png
您可以像这样为洋红色指定十六进制颜色:
magick image.png -channel RGB -colorspace gray -auto-level +level-colors '#ff00ff', result.png
如果使用 v6 ImageMagick,请将 magick
替换为 convert
。
我的 PHP 很生疏,但是像这样:
#!/usr/local/bin/php -f
<?php
// Emulating something akin to this ImageMagick command:
// magick image.png -fill red +opaque white result.png
// Open input image and get dimensions
$im = new \Imagick('image.png');
// Temporarily deactivate alpha channel
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
// Apply colour to non-white areas
$im->opaquePaintImage('white','red', 0, true);
// Reactivate alpha channel
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
// Save
$im->writeImage('result.png');
?>
我试过制作类似的东西。请测试以下代码是否满足您的要求。
<?PHP
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
/*
@desc replaces target color of an image with the provided fill color
*/
function color_replace($img,$target,$fill,$fuzz){
$img->opaquePaintImage($target, $fill, $fuzz, false, Imagick::CHANNEL_DEFAULT);
return $img;
}
$img = new Imagick('source.png');
$img->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
$fuzz = 0.44 * $img->getQuantumRange()['quantumRangeLong'];
$img=color_replace($img,'rgba(50,173,186,255)','red',$fuzz); // replace paste like color with red
$img=color_replace($img,'rgb(230,218,30)','#9c1f24',$fuzz); // replace golden like color with dark red
$img->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
$img->setImageFormat ("jpeg");
file_put_contents ("test_1.jpg", $img);
?>
我的程序产生的输出:
使用此程序,您可以在每次要更改颜色时调用 color_replace
方法来更改每种颜色。下图就是一个例子。
我在这里为您提供了另一个解决方案,当然也是使用 Imagick:
$im = new Imagick('path/to/start-image')
$im->transformimagecolorspace(Imagick::IMGTYPE_GRAYSCALE);
$im->writeImage('path/to/gray.jpg'));
$im->clear();
$im = new Imagick('path/to/gray.jpg'));
$im->blackThresholdImage( "#cdcdcd" );
$im->writeImage('path/to/black-white.jpg'));
$im->clear();
$im = new Imagick('path/to/black-white.jpg'));
$im->colorizeImage('rgba(209, 15, 16, 1)', 1, true);
$im->writeImage('path/to/red.jpg'));
$im->clear();
然后只需删除中间文件gray.jpg和black-white.jpg,你就会得到你想要的结果,如下所示:
我有一个简单的 HTML
表单,用户可以在其中上传他们的图片,我需要借助 PHP
比如用户上传了一些图片我需要将整张图片转换成特定的颜色(这个颜色是动态的)
是否有任何 PHPGD
库可以帮助我实现这一目标?
编辑
比如用户正在上传这种图片,
然后我需要转换成以下类型的图像,
你需要像 Imagick
. To replace some color, you need clutImage
$image = new Imagick('test.jpg');
$clut = new Imagick();
$clut->newImage(1, 1, new ImagickPixel('rgb(255, 0, 0)'));
$image->clutImage($clut);
$image->writeImage('test_out.jpg');
我仍然不确定你到底想做什么,但我认为以下其中一项可能很接近。也许你可以在终端中尝试它们,直到我们最终找出正确的操作,然后我们才有希望将它们翻译成 PHP。这是 ImageMagick v7 语法:
magick image.png -channel RGB -colorspace gray +level-colors red, result.png
或者这样:
magick image.png -fill red +opaque white result2.png
您可以像这样为洋红色指定十六进制颜色:
magick image.png -channel RGB -colorspace gray -auto-level +level-colors '#ff00ff', result.png
如果使用 v6 ImageMagick,请将 magick
替换为 convert
。
我的 PHP 很生疏,但是像这样:
#!/usr/local/bin/php -f
<?php
// Emulating something akin to this ImageMagick command:
// magick image.png -fill red +opaque white result.png
// Open input image and get dimensions
$im = new \Imagick('image.png');
// Temporarily deactivate alpha channel
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
// Apply colour to non-white areas
$im->opaquePaintImage('white','red', 0, true);
// Reactivate alpha channel
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
// Save
$im->writeImage('result.png');
?>
我试过制作类似的东西。请测试以下代码是否满足您的要求。
<?PHP
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
/*
@desc replaces target color of an image with the provided fill color
*/
function color_replace($img,$target,$fill,$fuzz){
$img->opaquePaintImage($target, $fill, $fuzz, false, Imagick::CHANNEL_DEFAULT);
return $img;
}
$img = new Imagick('source.png');
$img->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
$fuzz = 0.44 * $img->getQuantumRange()['quantumRangeLong'];
$img=color_replace($img,'rgba(50,173,186,255)','red',$fuzz); // replace paste like color with red
$img=color_replace($img,'rgb(230,218,30)','#9c1f24',$fuzz); // replace golden like color with dark red
$img->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
$img->setImageFormat ("jpeg");
file_put_contents ("test_1.jpg", $img);
?>
我的程序产生的输出:
使用此程序,您可以在每次要更改颜色时调用 color_replace
方法来更改每种颜色。下图就是一个例子。
我在这里为您提供了另一个解决方案,当然也是使用 Imagick:
$im = new Imagick('path/to/start-image')
$im->transformimagecolorspace(Imagick::IMGTYPE_GRAYSCALE);
$im->writeImage('path/to/gray.jpg'));
$im->clear();
$im = new Imagick('path/to/gray.jpg'));
$im->blackThresholdImage( "#cdcdcd" );
$im->writeImage('path/to/black-white.jpg'));
$im->clear();
$im = new Imagick('path/to/black-white.jpg'));
$im->colorizeImage('rgba(209, 15, 16, 1)', 1, true);
$im->writeImage('path/to/red.jpg'));
$im->clear();
然后只需删除中间文件gray.jpg和black-white.jpg,你就会得到你想要的结果,如下所示: