Я хочу удалить белый фон любого изображения, загруженного на сайт, работающий на платформе PHP. Функция загрузки выполняется, но перепуталась с этой функциональностью.
Вот ссылка, которую я нашел здесь: Удалите белый фон из изображения и сделайте его прозрачным
Но это делается наоборот. Я хочу удалить цветной фон и сделать его образ с прозрачным фоном.
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');
Поскольку вам нужна только прозрачность с одним цветом, самым простым способом является определение белого с помощью imagecolortransparent()
. Что-то вроде этого (непроверенный код):
$img = imagecreatefromstring($your_image); //or whatever loading function you need $white = imagecolorallocate($img, 255, 255, 255); imagecolortransparent($img, $white); imagepng($img, $output_file_name);
Попробуйте ImageMagick, он сделал трюк для меня. Вы также можете контролировать количество цвета, которое необходимо удалить. Просто пройдите путь изображения, bgcolor, как массив RGB, и fuzz в процентах. Пока у вас есть ImageMagick, установленный на вашей системе / хостинге. У меня мой хостинг-провайдер установил его для меня как модуль.
Я использую 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; }
получите индекс белого цвета на изображении и установите его прозрачным.
$whiteColorIndex = imagecolorexact($img,255,255,255); $whiteColor = imagecolorsforindex($img,$whiteColorIndex); imagecolortransparent($img,$whiteColor);
вы можете альтернативно использовать imagecolorclosest (), если вы не знаете точный цвет.
Используйте обработку изображений php и GD, прочитайте пиксель изображения по пикселям, если все компоненты RGB – 255 (пиксель белый), установите альфа-канал на 255 (прозрачный). Возможно, вам придется изменить тип файла изображения в зависимости от того, поддерживает ли загруженный тип файла альфа-канал.
Функция из @ geoffs3310 должна быть принятым ответом здесь, но обратите внимание, что сохраненный png не содержит альфа-канал.
Чтобы удалить фон и сохранить новый png в виде прозрачного 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);