Я надеюсь, что кто-то может помочь,
Я создал сценарий, который маскирует изображения … однако он зависит от цвета, маскирующего (стиль «зеленого экрана»). Проблема в том, что изображение, которое я маскирую, содержит этот цвет, он разрушен.
То, что я хочу сделать, это до маскировки изображения заменить любое появление моего ключевого цвета (0,0,255) с таким же цветом, как 0,0254.
Я нашел несколько решений, основанных на gif или 256 цветных PNG, поскольку они индексируются ..
Поэтому мой вопрос заключается в том, будет ли более эффективным преобразовать его в gif или 256 png, затем просмотрите индекс и замените цвет или выполните поиск по каждому пикселю и замените цвета.
Благодаря,
Вам нужно открыть входной файл и проверить каждый пиксель, чтобы проверить его значение.
Что-то вроде этого:
// Open input and output image $src = imagecreatefromJPEG('input.jpg') or die('Problem with source'); $out = ImageCreateTrueColor(imagesx($src),imagesy($src)) or die('Problem In Creating image'); // scan image pixels for ($x = 0; $x < imagesx($src); $x++) { for ($y = 0; $y < imagesy($src); $y++) { $src_pix = imagecolorat($src,$x,$y); $src_pix_array = rgb_to_array($src_pix); // check for chromakey color if ($src_pix_array[0] == 0 && $src_pix_array[1] == 0 && $src_pix_array[2] == 255) { $src_pix_array[2] = 254; } imagesetpixel($out, $x, $y, imagecolorallocate($out, $src_pix_array[0], $src_pix_array[1], $src_pix_array[2])); } } // write $out to disc imagejpeg($out, 'output.jpg',100) or die('Problem saving output image'); imagedestroy($out); // split rgb to components function rgb_to_array($rgb) { $a[0] = ($rgb >> 16) & 0xFF; $a[1] = ($rgb >> 8) & 0xFF; $a[2] = $rgb & 0xFF; return $a; }
Вот замена цветового решения, которое сначала преобразует в 256 паллет:
//Open Image $Image = imagecreatefromJPEG('input.jpg') or die('Problem with source'); //set the image to 256 colours imagetruecolortopalette($Image,0,256); //Find the Chroma colour $RemChroma = imagecolorexact( $Image, 0,0,255 ); //Replace Chroma Colour imagecolorset($Image,$RemChroma,0,0,254); //Use function to convert back to true colour imagepalettetotruecolor($Image); function imagepalettetotruecolor(&$img) { if (!imageistruecolor($img)) { $w = imagesx($img); $h = imagesy($img); $img1 = imagecreatetruecolor($w,$h); imagecopy($img1,$img,0,0,0,0,$w,$h); $img = $img1; } }
Я лично предпочитаю решение radio4fans, поскольку оно без потерь, но если скорость – это ваша цель, это лучше.