2011-07-06 3 views
2

私は画像を撮り、カラーパレットをあらかじめ設定されたパレットに縮小したいと考えています。純粋な白黒、16色、64色などを試したい。PHPを使用して画像にあらかじめ定義されたカラーパレットを強制するにはどうすればよいですか?

画像の色に基づいてパレットを作成するので、私はimagetruecolortopalette()を使用できませんが、あらかじめ定義されたパレットを使用します。私はまた、グレースケールにしてから着色することもできません。それは、元の色がすべて失われてしまい、結果として得られるイメージが1色にしかならないためです。

+0

私は混乱しています:画像に基づいていない事前定義されたパレットは「元の色が失われます」 – horatio

答えて

0

私はこのfunctionをphp関数で見ましたが、先日コメントしてくれました。あなたがしなければならないのは、あなたの "新しい"イメージに必要な色の配列を作成し、古いイメージに渡すだけです。

$arr = array('#000000', '#990000', '#00FFFF', '#FFFFDD'); 
colorize ($img, $arr); 

<?php 
function colorize($imgdata, $palette) 
{ 
    imageTrueColorToPalette($imgdata,false,0xFF); 
    $l = count($palette)-1; 
    $i = imagecolorstotal($imgdata); 
    while ($i--) 
    { 
    list($r,$g,$b) = array_values(imageColorsForIndex($imgdata,$i)); 

    $grayscale = ($r*.3 + $g*.59 +$b*.11)/0xFF; 

    $pos = $l*$grayscale; 

    $perc = $pos-floor($pos); 

    $tbase = str_replace("#", '', $palette[$pos]); 
    $baseR = hexdec(substr($tbase,0,2)); 
    $baseG = hexdec(substr($tbase,2,2)); 
    $baseB = hexdec(substr($tbase,4,2)); 

    $tmix = str_replace("#", '', $palette[$pos+1]); 
    $mixR = hexdec(substr($tmix,0,2)); 
    $mixG = hexdec(substr($tmix,2,2)); 
    $mixB = hexdec(substr($tmix,4,2)); 

    $resR = $baseR+($mixR-$baseR)*$perc; 
    $resG = $baseG+($mixG-$baseG)*$perc; 
    $resB = $baseB+($mixB-$baseB)*$perc; 

    imagecolorset($imgdata, $i, $resR, $resG, $resB); 
    } 
} 
?>