使用php删除图像背景并保存透明png

使用php删除图像背景并保存透明png,php,Php,我想删除在PHP平台上工作的网站上传的任何图像的白色背景。上传功能已完成,但与此功能混乱 以下是我在这里找到的链接: 但这恰恰相反。我想删除彩色背景,使其成为透明背景的图像。使用php图像处理和GD,逐像素读取图像 如果RGB组件全部为255(像素为白色),则设置alpha 通道至255(透明)。您可能必须更改图像的文件类型 取决于上传的文件类型是否支持alpha通道。由于您只需要单色透明度,最简单的方法是使用imagecolortransparent()定义白色。类似于以下内容(未经测试的代

我想删除在PHP平台上工作的网站上传的任何图像的白色背景。上传功能已完成,但与此功能混乱

以下是我在这里找到的链接:


但这恰恰相反。我想删除彩色背景,使其成为透明背景的图像。

使用php图像处理和GD,逐像素读取图像 如果RGB组件全部为255(像素为白色),则设置alpha 通道至255(透明)。您可能必须更改图像的文件类型
取决于上传的文件类型是否支持alpha通道。

由于您只需要单色透明度,最简单的方法是使用
imagecolortransparent()
定义白色。类似于以下内容(未经测试的代码):


获取图像中白色的索引并将其设置为透明

$whiteColorIndex = imagecolorexact($img,255,255,255);
$whiteColor = imagecolorsforindex($img,$whiteColorIndex);
imagecolortransparent($img,$whiteColor);

如果您不知道确切的颜色,也可以使用imagecolorclosest()。

试试ImageMagick它帮了我的忙。您还可以控制需要删除的颜色量。只需将图像路径、bgcolor作为RGB数组传递,并以百分比表示模糊。只要系统/主机上安装了ImageMagick。我让我的主机提供商为我安装了一个模块

function transparent_background($filename, $color) 
{
    $img = imagecreatefrompng('image.png'); //or whatever loading function you need
    $colors = explode(',', $color);
    $remove = imagecolorallocate($img, $colors[0], $colors[1], $colors[2]);
    imagecolortransparent($img, $remove);
    imagepng($img, $_SERVER['DOCUMENT_ROOT'].'/'.$filename);
}

transparent_background('logo_100x100.png', '255,255,255');
我使用的是ImageMagick版本6.2.8

例如:

    $image = "/path/to/your/image.jpg";
    $bgcolor = array("red" => "255", "green" => "255", "blue" => "255");
    $fuzz = 9;
    remove_image_background($image, $bgcolor, $fuzz); 

        protected function remove_image_background($image, $bgcolor, $fuzz)
        {
            $image = shell_exec('convert '.$image.' -fuzz '.$fuzz.'% -transparent "rgb('.$bgcolor['red'].','.$bgcolor['green'].','.$bgcolor['blue'].')" '.$image.'');
            return $image;
        }

@geoffs3310中的函数应该是这里可以接受的答案,但是请注意,保存的png不包含alpha通道

要删除背景并将新的png保存为透明的带有alpha的png,以下代码有效

$_filename='/home/files/IMAGE.png';
$_backgroundColour='0,0,0';
$_img = imagecreatefrompng($_filename);
$_backgroundColours = explode(',', $_backgroundColour);
$_removeColour = imagecolorallocate($_img, (int)$_backgroundColours[0], (int)$_backgroundColours[1], (int)$_backgroundColours[2]);
imagecolortransparent($_img, $_removeColour);
imagesavealpha($_img, true);
$_transColor = imagecolorallocatealpha($_img, 0, 0, 0, 127);
imagefill($_img, 0, 0, $_transColor);
imagepng($_img, $_filename);

从URL转换为的版本,并在第页返回:

$img = imagecreatefromjpeg('http://mypage.com/image.jpg');

$remove = imagecolorallocate($img, 255, 255, 255); // Define color rgb to remove
imagecolortransparent($img, $remove);

ob_start();
imagepng($img);
$imgData = ob_get_clean();
imagedestroy($img);

$data_img = 'data:image/png;base64,'.base64_encode($imgData);
echo '<body style="background: #f00;"><img src="'.$data_img.'"></body>';
$img=imagecreatefromjpeg('http://mypage.com/image.jpg');
$remove=imagecolorallocate($img,255,255,255);//定义要删除的颜色rgb
imagecolortransparent($img,$remove);
ob_start();
图像PNG($img);
$imgData=ob_get_clean();
图像处理(img);
$data_img='数据:图像/png;base64'..base64_编码($imgData);
回声';

请说明减号voteexplain的原因,并向我们展示您所做的一切,我并不是被否决的人。我尝试了dis,但在屏幕上显示了不需要的字符:$file='itsmehere.png';//png图像的路径$img=imagecreatefrompng($file);//打开图像$white=imagecolorallocate($img,255,255,255);imagecolortransparent($img,$color);imagepng($img,$output\u file\u name);请详细说明“不需要的字符”。这是一个警告(imagefill()获取的资源无效),然后是一个PNG图像。但我需要保存PNG图像。而无法得到它。接下来要做什么?如果要保存它,需要将文件名作为第二个参数传递给imagepng。您当前传递null,这就是它输出图片的原因。警告:imagecolortransparent()要求参数2为整数,数组给定。如何为数组的3个键传递整数?
$img = imagecreatefromjpeg('http://mypage.com/image.jpg');

$remove = imagecolorallocate($img, 255, 255, 255); // Define color rgb to remove
imagecolortransparent($img, $remove);

ob_start();
imagepng($img);
$imgData = ob_get_clean();
imagedestroy($img);

$data_img = 'data:image/png;base64,'.base64_encode($imgData);
echo '<body style="background: #f00;"><img src="'.$data_img.'"></body>';