PHP:将动态上传的图像转换为特定颜色(动态颜色)

Posted

技术标签:

【中文标题】PHP:将动态上传的图像转换为特定颜色(动态颜色)【英文标题】:PHP : Convert dynamic uploaded image to specific color(dynamic color) 【发布时间】:2020-10-17 05:21:21 【问题描述】:

我有一个简单的html 表单,用户可以在其中上传他们的图片,我需要在php 的帮助下将此上传的图片转换为特定颜色

比如用户上传一些图片我需要将整个图片转换成特定的颜色(这个颜色是动态的)

是否有任何PHPGD 库可以帮助我实现这一目标?

编辑

例如,用户正在上传这种图片,

然后我需要转换成以下类型的图像,

【问题讨论】:

安装和使用Imagick 库。做很多事情真是太棒了。包括这个。 谢谢,你知道任何例子吗?从未使用过 Imagick,任何示例都会很有帮助 请提供示例输入图像和预期结果。也许这个? ***.com/a/36825769/2836621 没有具体或示例图片,因为用户可以上传任何有效图片,我需要将任何图片转换为我的颜色,因此您可以考虑任何图片。 一点都不是很清楚。我给你发一张女王的照片,你把它改成蓝色,然后给我发回一张和原图一样大小的纯蓝色图片? 【参考方案1】:

你需要一些像Imagick 这样的库。要替换一些颜色,你需要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');

【讨论】:

谢谢解答,比如我上传的图片有多种颜色,那我该怎么做呢?在这里我可以看到你只通过了一种颜色 @KeyurShah 所以循环你的颜色替换 如何找到我所有的图像颜色?【参考方案2】:

我仍然不确定您到底要做什么,但认为以下其中一项可能很接近。也许您可以在终端中尝试它们,直到我们最终能够计算出正确的操作,然后我们才有希望将它们翻译成 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,请再看看。 通过代码,它也将颜色应用于白色, 在您提供的示例图像上,它在我的机器上运行良好。您是否使用了不同的图像? 是的,我使用了不同的图像(我使用了 15 个不同的图像,命令效果非常好)。你检查了一些不同的图像吗?【参考方案3】:

我试图制作类似的东西。如果满足您的要求,请测试以下代码。

 <?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 方法来更改每个单独的颜色。下图就是一个例子。

【讨论】:

我如何知道#9c1f24 颜色是否需要更换?因为这张图片不是静态的,它是动态的,用户可以上传任何类型的图片, 如何接受用户输入。例如,使用颜色选择器,我们可以轻松获取他们的输入。但问题可能是输入错误。我会想更多给你一个想法。照片编辑器的滴管行为可能会自动从照片中挑选所有颜色并要求用户提供替换颜色。但我会想得更多。谢谢【参考方案4】:

我在这里为您提供另一个解决方案,当然也是使用 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 即可获得您想要的结果:

【讨论】:

以上是关于PHP:将动态上传的图像转换为特定颜色(动态颜色)的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 将特定的 RGB 颜色替换为另一个图像

使用 PHP 将 SVG 图像转换为 PNG

如何将图案图像动态添加到 svg?

PHP图像动态调整大小和圆角图像

将PDF转换为图像时,ImageMagick会更改颜色

动态创建不同亮度的颜色