PHP GD kütüphanesi kullanarak görüntüdeki renkleri takas edebilir miyim?

7 Cevap php

Bu gibi resmi (bir grafik var) var:

Gold Ticaret Graph

Ben renklerini değiştirmek istiyorum, bu yüzden beyaz grafik çizgi vb, açık mavi, siyah. Bunun GD ve PHP ile elde etmek mümkün mü?

7 Cevap

Bu Gray ile beyaz renk yerini alacak

$imgname = "test.gif";
$im = imagecreatefromgif ($imgname);

$index = imagecolorclosest ( $im,  255,255,255 ); // get White COlor
imagecolorset($im,$index,92,92,92); // SET NEW COLOR

$imgname = "result.gif";
imagegif($im, $imgname ); // save image as gif
imagedestroy($im);

alt text

Ben sorun bu çözüm çalışması yapmak vardı. Görüntü gerçek renkli görüntü olamaz. Imagetruecolortopalette ilk dönüştürmek ();

$imgname = "test.gif";
$im = imagecreatefromgif ($imgname);

imagetruecolortopalette($im,false, 255);

$index = imagecolorclosest ( $im,  255,255,255 ); // get White COlor
imagecolorset($im,$index,92,92,92); // SET NEW COLOR

$imgname = "result.gif";
imagegif($im, $imgname ); // save image as gif
imagedestroy($im);

Ben bu geç ve aslında sonra olduğunu biliyorum, ama ben birlikte biraz daha geniş ölçekte bu yapacak bir senaryo koyduk. Umarım bu yazı karşısında söz birisi kullanabilirsiniz. Bu bir renk katmanları (tercih) olan kaynak görüntülerin bir dizi alır. Bir kaynak rengin ve her katmanın renk tonu ile bunu sağlamak ve script sağlanan hex koduna özellikle renkli (tam şeffaflık ile) bir kompozit görüntü verir.

Aşağıdaki kodu göz atın. Daha detaylı bir açıklama benim blog bulunabilir.

function hexLighter($hex, $factor = 30) {
    $new_hex = '';

    $base['R'] = hexdec($hex{0}.$hex{1});
    $base['G'] = hexdec($hex{2}.$hex{3});
    $base['B'] = hexdec($hex{4}.$hex{5});

    foreach ($base as $k => $v) {
        $amount = 255 - $v;
        $amount = $amount / 100;
        $amount = round($amount * $factor);
        $new_decimal = $v + $amount;

        $new_hex_component = dechex($new_decimal);

        $new_hex .= sprintf('%02.2s', $new_hex_component);
    }

    return $new_hex;
}

// Sanitize/Validate provided color variable
if (!isset($_GET['color']) || strlen($_GET['color']) != 6) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request', true, 400);

    exit(0);
}

if (file_exists( "cache/{$_GET['color']}.png" )) {
    header( 'Content-Type: image/png' );
    readfile( "cache/{$_GET['color']}.png" );

    exit(0);
}

// Desired final size of image
$n_width = 50;
$n_height = 50;

// Actual size of source images
$width = 125;
$height = 125;

$image =    imagecreatetruecolor($width, $height);
            imagesavealpha($image, true);
            imagealphablending($image, false);

$n_image =  imagecreatetruecolor($n_width, $n_height);
            imagesavealpha($n_image, true);
            imagealphablending($n_image, false);

$black = imagecolorallocate($image, 0, 0, 0);
$transparent = imagecolorallocatealpha($image, 255, 255, 255, 127);

imagefilledrectangle($image, 0, 0, $width, $height, $transparent);

$layers = array();
$layers_processed = array();

$layers[] = array( 'src' => 'layer01.gif', 'level' => 0 );  // Border
$layers[] = array( 'src' => 'layer02.gif', 'level' => 35 );     // Background
$layers[] = array( 'src' => 'layer03.gif', 'level' => 100 );    // White Quotes

foreach ($layers as $idx => $layer) {
    $img = imagecreatefromgif( $layer['src'] );
    $processed = imagecreatetruecolor($width, $height);

    imagesavealpha($processed, true);
    imagealphablending($processed, false);

    imagefilledrectangle($processed, 0, 0, $width, $height, $transparent);

    $color = hexLighter( $_GET['color'], $layer['level'] );
    $color = imagecolorallocate($image,
        hexdec( $color{0} . $color{1} ),
        hexdec( $color{2} . $color{3} ),
        hexdec( $color{4} . $color{5} )
    );

    for ($x = 0; $x < $width; $x++)
        for ($y = 0; $y < $height; $y++)
            if ($black === imagecolorat($img, $x, $y))
                imagesetpixel($processed, $x, $y, $color);

    imagecolortransparent($processed, $transparent);
    imagealphablending($processed, true);

    array_push($layers_processed, $processed);

    imagedestroy( $img );
}

foreach ($layers_processed as $processed) {
    imagecopymerge($image, $processed, 0, 0, 0, 0, $width, $height, 100);

    imagedestroy( $processed );
}

imagealphablending($image, true);

imagecopyresampled($n_image, $image, 0, 0, 0, 0, $n_width, $n_height, $width, $height);

imagealphablending($n_image, true);

header( 'Content-Type: image/png' );
imagepng( $n_image, "cache/{$_GET['color']}.png" );
imagepng( $n_image );

// Free up memory
imagedestroy( $n_image );
imagedestroy( $image );

Ben herhangi bir hazır fonksiyonların farkında değilim. Ama resmin her pikseli yalak ve onun rengini değiştirmek gidebiliriz ...

Ben kendim denemedim ama bir renk etkisi gibi doldurmak demek GD kütüphanesinde imagecolorset() fonksiyonuna bakabilirsiniz, bu beyaz arka plan ile yardımcı olabilir.

Sen http://lv.php.net/imagefilter imagefilter işlevini deneyebilirsiniz - ama bu sadece r / g / b bileşenlerini değiştirerek, başka bir renkle değiştirmek için doğrudan erişim vermeyecektir.

Çok düşük düzeyde çözüm yeni piksel değerlerini ayarlamak için imagesetpixel http://nl2.php.net/imagesetpixel kullanılarak uygulanabilir.

IMG_FILTER_NEGATE: görüntünün tüm renklerini tersine çevirir.

http://www.php.net/manual/en/function.imagefilter.php

Bu bir çözüm olabilir mi?