2010-09-18 4 views

Répondre

1

Eh bien, vous pouvez le faire en utilisant ImageMagick via la ligne de commande:

convert original.png -matte (+clone -fuzz 1 -transparent #005d00) -compose DstOut -composite isolated.png 

La commande -fuzz peut prendre un écart de pourcentage par rapport à la couleur, si elle est spécifique, déposez le fuzz.

Le() crochets doivent Echappés dans bash shell \ (\), etc.

2

Vous pouvez utiliser la fonction imagecolorat() de gd.
Juste itérer sur chaque pixel, vérifiez si c'est la couleur que vous voulez, sinon set en noir ou blanc ou ce que vous voulez faire avec.

Voici un exemple de travail:

function colorEquals($rgb_color, $hex_color) 
{ 
    $r = ($rgb_color >> 16) & 0xFF; 
    $g = ($rgb_color >> 8) & 0xFF; 
    $b = $rgb_color & 0xFF; 


    list($hr, $hg, $hb) = sscanf($hex_color, '%2s%2s%2s'); 
    $hr = hexdec($hr); 
    $hg = hexdec($hg); 
    $hb = hexdec($hb); 

    return $r == $hr && $g == $hg && $b == $hb; 
} 

$width = 300; 
$height = 300; 

// create 300x300 image 
$img = imagecreatetruecolor($width, $height); 
// fill grey 
$color = imagecolorallocate($img, 127, 127, 127); 
imagefill($img, 0, 0, $color); 

// set a square of pixels to 005d00 
$your_color = imagecolorallocate($img, 0, 93, 0); 
imagefilledrectangle($img, 10, 10, 100, 100, $your_color); 

$white = imagecolorallocate($img, 255, 255, 255); 

for($x = 0; $x < $width; ++$x) 
{ 
    for($y = 0; $y < $height; ++$y) 
    { 
     $color = imagecolorat($img, $x, $y); 
     if(!colorEquals($color, '005d00')) 
     { 
      // set it to white 
      imagesetpixel($img, $x, $y, $white); 
     } 
    } 
} 

// output 
header('Content-type: image/png'); 
imagepng($img); 
+0

Il serait extremally de temps pour les grandes images. Merci pour la réponse mais je pensais plutôt à supprimer tous les bleus et les rouges de l'image. Mais je ne sais pas comment le faire. –

+0

@mickula: Il est impossible d'obtenir plus efficace que cela (peut-être par un facteur constant - mais pas par une quantité asymptotiquement significative). Pensez-y: chaque pixel doit être réitéré au moins une fois pour conserver la couleur ou la modifier, à moins que vous n'utilisiez un format d'image inconnu qui offre des informations supplémentaires. – Cam

+0

'$ average = new Imagick (" duzykevarska.png "); header ("Content-Type: image/png"); $ clut = new Imagick(); $ clut-> newImage (1, 1, nouvelle ImagickPixel ("rgb (0,93,0)")); $ average-> opaquePaintImage (nouveau ImagickPixel ("rgb (0,93,0)"), "blanc", 255, true); echo $ average; ' –

Questions connexes