Dinamik bir PNG görüntüsü oluşturmak

4 Cevap php

Ben renk, şekil, şeffaflık vb gibi argümanlar alır ve bir PNG resmi çıktılar PHP küçük bir işlev oluşturmak istiyorum. PHP GD kütüphanesi hakkında duydum ama nasıl bir soon.media.mit.edu gibi yaratıcı bir şey oluşturabilirsiniz bilmek istiyorum

4 Cevap

This is a good example, sen these functions kullanarak hemen hemen her şeyi yapabilirsiniz. Mümkün olsa da ben yine de geçişlerini, döngüler ve renkleri ile bazı garip şeyler yapmış tarafından, sizin tarif gibi bir görüntü oluştururken oldukça zor olurdu.

Dinamik her zaman photoshop önceden görüntüler oluşturmak ve ardından bir kullanıcı seçtiğinde ne dayalı kapla bazı parametrelere dayalı böyle bir resim yapmak istedim.

Eğer olabilir eğlenceli bir çok şey var.

Edit: Oh arada, giving an invalid parameter shows some of the python code Bu imaj yaratma ve hataya neden sorumlu ilgilenen varsa. Bu kod bazı fikir almak için iyi bir yer olurdu.

2. Düzenleme: Bu teknolojinin bu tür yapmış sadece bir şeydir. Akılda oldukça bir süre önceydi ayı. Bu sorgu dizesi dayalı bir ad kabul eder ve temelde rasgele sayılar bir sürü birkaç döngüler yapar.

Burada kaynak kodu herhangi bir aptal kodu / tırnak için özür dileriz, olduğunu. Ben yaklaşık 14 I (muhtemelen birçok kusurları) iman iken Bu, uzunca bir süre önce yazılmıştır.

<?php
header("Content-type:image/jpeg");
$array=array("I am a monument to all your sins", "Currently making pizza","Best before 12/7/09", "Farming Onions");
        function imagettftext_cr(&$im, $size, $angle, $x, $y, $color, $fontfile, $text)
        {
            // retrieve boundingbox
            $bbox = imagettfbbox($size, $angle, $fontfile, $text);
            // calculate deviation
            $dx = ($bbox[2]-$bbox[0])/2.0 - ($bbox[2]-$bbox[4])/2.0;         // deviation left-right
            $dy = ($bbox[3]-$bbox[1])/2.0 + ($bbox[7]-$bbox[1])/2.0;        // deviation top-bottom
            // new pivotpoint
            $px = $x-$dx;
            $py = $y-$dy;
            return imagettftext($im, $size, $angle, $px, $y, $color, $fontfile, $text);
        }
$image = imagecreate(500,90);
$black = imagecolorallocate($image,0,0,0);
$grey_shade = imagecolorallocate($image,40,40,40);
$white = imagecolorallocate($image,255,255,255);


$text = $array[rand(0,sizeof($array)-1)];

// Local font files, relative to script
$otherFont = 'army1.ttf';
$font = 'army.ttf';

if($_GET['name'] == ""){ $name = "Sam152";}else{$name= $_GET['name'];}
$name = substr($name, 0, 25);    


//BG text for Name
while($i<10){
imagettftext_cr($image,rand(2,40),rand(0,50),rand(10,500),rand(0,200),$grey_shade,$font,$name);
$i++;
}
//BG text for saying
while($i<10){
imagettftext_cr($image,rand(0,40),rand(90,180),rand(100,500),rand(200,500),$grey_shade,$otherFont,$text);
$i++;
}

// Main Text
imagettftext_cr($image,35,0,250,46,$white,$font,$name);
imagettftext_cr($image,10,0,250,76,$white,$otherFont,$text);
imagejpeg($image);

?>

İşte sorgu dizesi parametrelerini kabul iki isim, bir görüntü oluşturmak için önce kullanılan kod. Ben hazırlanmış bir arka plan görüntüsü kullanmak ve bunun üstüne adlarını koydu.

<?php
// Print two names on the picture, which accepted by query string parameters.

$n1 = $_GET['n1'];
$n2 = $_GET['n2'];

Header ("Content-type: image/jpeg");
$image = imageCreateFromJPEG("images/someimage.jpg");
$color = ImageColorAllocate($image, 255, 255, 255);

// Calculate horizontal alignment for the names.
$BoundingBox1 = imagettfbbox(13, 0, 'ITCKRIST.TTF', $n1);
$boyX = ceil((125 - $BoundingBox1[2]) / 2); // lower left X coordinate for text
$BoundingBox2 = imagettfbbox(13, 0, 'ITCKRIST.TTF', $n2);
$girlX = ceil((107 - $BoundingBox2[2]) / 2); // lower left X coordinate for text

// Write names.
imagettftext($image, 13, 0, $boyX+25, 92, $color, 'ITCKRIST.TTF', $n1);
imagettftext($image, 13, 0, $girlX+310, 92, $color, 'ITCKRIST.TTF', $n2);

// Return output.
ImageJPEG($image, NULL, 93);
ImageDestroy($image);
?>

Oluşturulan görüntüyü görüntülemek için sayfada bu gibi bir şey yapın:

<img src="myDynamicImage.php?n1=bebe&n2=jake" />

Değil doğrudan bir cevap "PHP bunu yapıyor" ama bazı güçlü komut satırı yazılım from PHP arayabilirsiniz. Özellikle ImageMagick evye dahil her şeyi çekecektir. Aynı zamanda "out-of-band" işleme "back-end" komut (yani, istek gruplar halinde (hızlı kullanıcı geribildirim) veya gece geç saatlerde tamamlandıktan sonra kaynaklar sırasında sıkı olduğunda görüntü işleme gerçekleştirmek için mevcut olma avantajına sahiptir zirve kez.

Bu sizin için ne arıyorsanız, tamamen değil, ama ben saydam görüntülerin içine dinamik renk katmanları eklemek için bir komut dosyası araya. Sen tek-renkli görüntüler "katmanları" ile kurmak ve çalıştırmak için, ona bir onaltılık renk kodu beslemek. Senaryosunu yeniden renkler katmanları ve sunmak için tek bir görüntü haline birleştirir. İşte kod; umarım bunun dışında bazı kullanım alabilirsiniz.

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 );

Bu kod hakkında daha fazla bilgi istiyorsanız, benim blog üzerine ayrıntılı bir açıklamasını var.