2009-10-10 18 views
6

Mam nadzieję, że ktoś może pomóc,PHP - Wymienić koloru wewnątrz obrazu

zrobiłem skrypt, który maskuje obrazy ... jednak jest to zależne od koloru do maski z („green screen” styl). Problem polega na tym, że obraz, który ukrywam zawiera ten kolor, jest zniszczony.

To, czego oczekuję, to przed zamaskowaniem obrazu, zastąpienie jakiegokolwiek koloru kluczowania (0,0,255) podobnym kolorem, na przykład 0,0,254.

Znalazłem kilka rozwiązań opartych wokół GIF lub 256 kolorów PNG, ponieważ są one indeksowane ..

Więc moje pytanie jest również będzie bardziej wydajny, aby przekształcić go w formacie GIF lub 256 png następnie przejrzeć Indeksuj i zamień kolor lub przeszukaj każdy piksel i zamień kolory.

Dzięki,

+0

Co masz na myśli mówiąc "maskowanie"? Czy masz przezroczyste części obrazu? Do czego dokładnie używasz zielonego koloru (lub innego koloru chromakey)? – lapo

+0

przez maskowanie Mam na myśli wypełnienie kwadratu moim kolorem chromakey, a następnie wycięcie go z przezroczystych pikseli, a następnie nałożenie go na obrazek. Następnie zastąpienie koloru chromakey przezroczystymi pikselami – Mark

Odpowiedz

9

Musisz otworzyć plik wejściowy i skanować każdy piksel w celu sprawdzenia swojej wartości chromokey.

coś takiego:

// 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; 
} 
+0

To wygląda fantastycznie ... Wydajność jest mądra, jak myślisz, co by porównać do konwersji obrazu na 256 palet, używając imagecolorexact i imagecolorset, aby zastąpić dowolne wystąpienie koloru, a następnie przekształcić go z powrotem w prawdziwy obraz kolorowy? – Mark

+0

To działa idealnie, ale po prostu przetestowałem go i jest co najmniej 5 razy mniej wydajne, niż konwertowanie go na obraz z 256 palet iz powrotem ... ale dla jakości obrazu jest lepsze, gdy jakość jest tracona podczas konwersji do 256 kolorów, Dziękuję Radio4fan! – Mark

2

Oto rozwiązanie kolorów, który najpierw konwertuje do 256 palecie wymienić:

//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; 
     } 
    } 

ja osobiście wolę rozwiązania radio4fans jak to jest bezstratna, ale jeśli prędkość jest twój cel jest lepszy.