PHP确定图像的背景色

PHP确定图像的背景色,php,image,Php,Image,我一直在看CustomInk,我很好奇他们是如何决定什么颜色是背景色的。例如,如果我上传Facebook徽标,他们决定从图像中删除蓝色 但是如果我上传一张苹果的白色背景图片,他们会以类似的方式去除白色。(即使白色背景不是主色) 在PHP中使用ImageMagick,我怎样才能完成这项任务呢?我找到了一个解决方案,可以在图像中找到背景色,然后用PHP和Imagick将其删除。一、 而不是使用边缘,决定使用角落,以找出哪些颜色删除,这似乎是工作的大部分时间。下面是一些结果 我能把它变成这样 (

我一直在看CustomInk,我很好奇他们是如何决定什么颜色是背景色的。例如,如果我上传Facebook徽标,他们决定从图像中删除蓝色

但是如果我上传一张苹果的白色背景图片,他们会以类似的方式去除白色。(即使白色背景不是主色)


在PHP中使用ImageMagick,我怎样才能完成这项任务呢?

我找到了一个解决方案,可以在图像中找到背景色,然后用PHP和Imagick将其删除。一、 而不是使用边缘,决定使用角落,以找出哪些颜色删除,这似乎是工作的大部分时间。下面是一些结果

我能把它变成这样

(背景图像是我在谷歌上找到的白色编织材料的纹理)。但这似乎也能很好地处理渐变背景

这是一张维特的照片,先是原稿,然后将所有角的颜色更改为透明,最后一张是从角开始使用填充

$Image = new Imagick('vette.jpg');
$BackgroundColors = array(
    'TopLeft' => array(1, 1),
    'TopRight' => array($Image->getimagewidth(), 1),
    'BottomLeft' => array(1, $Image->getimageheight()),
    'BottomRight' => array($Image->getimagewidth(), $Image->getimageheight())
);

foreach ($BackgroundColors as $Key => $BG) {
    $pixel = $Image->getImagePixelColor($BG[0], $BG[1]);
    $colors = $pixel->getColor();
    $ExcludedColors[] = rgb2hex(array_values($colors));
    $Image->floodfillPaintImage('none', 9000, $pixel, $BG[0] - 1, $BG[1] - 1, false);
    //Comment the line above and uncomment the below line to achieve the effects of the second Vette
    //$Image->transparentPaintImage($pixel, 0, 9000, false);
}
$Image->writeImage("vette-no_background.png");

我不知道这是否真的是一个合适的问题,但我最好的猜测是他们假设图像中的主要颜色是背景。这在很多(大多数)情况下都适用。无论是谁投票决定关闭,请解释我如何修改我的提问方式,不要被认为过于宽泛。我不这么认为,因为如果我上传我所谈论的苹果的图片,苹果是图片的大部分,但带有白色边缘,它仍然认为白色是需要去除的颜色。我认为问题是“太宽了”,因为可以有几种方法来确定背景色,甚至是多种方法的组合。虽然我不是那个投票通过的人。在玩了那个网站之后,我确定他们使用外线像素来获得背景色。占主导地位的颜色将被假定为背景色。如果是50/50,它可能会遵循要选择的颜色托盘(或随机的),或正确的,顶部的,无论他们在50/50的情况下选择什么。