2009-05-23 14 views
20

Voglio creare una piccola funzione in PHP che accetta argomenti come colore, forma, trasparenza ecc. E genera un'immagine PNG. Ho sentito parlare della libreria GD di PHP, ma voglio sapere come si può creare qualcosa di creativo come soon.media.mit.eduCreare un'immagine PNG dinamica

+0

link in basso .......... – Pacerier

+0

@Pacerier Sembrava qualcosa del genere (https://web.archive.org/web/20090720063343/http://soon.media.mit.edu/masthead/images/hdr -research-landing.jpg) ma il colore, il testo e la trasparenza cambiano de in attesa del parametro fornito. Ora abbiamo servizi come cloud e imgix ma a quei tempi era qualcosa di nuovo! – apnerve

risposta

19

This is a good example, si può fare praticamente tutto usando these functions. Anche se possibile, creare un'immagine come quella che hai descritto sarebbe stato piuttosto difficile da parte mia, ho fatto cose strane con sfumature, loop e colori.

Se si desidera rendere un'immagine in modo dinamico in base ad alcuni parametri, è sempre possibile creare le immagini in anticipo in Photoshop e quindi sovrapporle in base a ciò che l'utente seleziona.

C'è molto divertimento che puoi avere.

Modifica: Oh a proposito, se il tuo interessato è lo giving an invalid parameter shows some of the python code responsabile della creazione dell'immagine e della causa dell'errore. Sarebbe un buon posto per avere un'idea del codice.

2nd Edit: Questo è solo qualcosa che ho fatto con questo tipo di tecnologia. Ricorda che è stato un po 'di tempo fa. Accetta un nome basato sulla stringa di query e fondamentalmente fa alcuni loop con molti numeri casuali.

Ecco il codice sorgente, mi scuso per qualsiasi codice/citazioni stupidi. Questo è stato scritto un po 'di tempo fa, quando avevo circa 14 anni credo (probabilmente molti difetti).

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

?> 
+1

hey! è stato davvero bello. Non ho mai saputo che questo potrebbe essere raggiunto utilizzando queste funzioni. – apnerve

+0

Oh sì, questa è la punta dell'iceberg. C'è così tanto là fuori. – Sam152

+0

Pensavo mi avesse chiesto delle immagini PNG? –

6

Ecco il codice che ho usato prima per generare un'immagine con due nomi, che sono accettati dai parametri di stringa di query. Io uso un'immagine di sfondo preparata e metto sopra i nomi.

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

Per visualizzare l'immagine generata sulla pagina si fa qualcosa di simile:

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

Esattamente quello che dovevo vedere per ricordare come farlo. +1 – ThisBoyPerforms

4

Non è una risposta diretta a "farlo in PHP", ma si può chiamare alcuni software potente della riga di comando da PHP. In particolare ImageMagick disegnerà tutto compreso il lavello della cucina. Ha anche il vantaggio di essere disponibile per script "back-end" per l'elaborazione "out-of-band" (cioè, l'elaborazione delle immagini dopo che la richiesta è stata completata (feedback degli utenti più veloce) o a tarda notte nei batch quando le risorse sono strette durante ore di punta

2

Non è completamente quello che stai cercando, ma ho messo insieme uno script per inserire i livelli di colore dinamici in immagini trasparenti. Lo hai impostato con "strati" di immagini a un colore e per eseguirlo, feed . un codice esadecimale del colore Gli script Nuovo colori i livelli e li fonde in un'unica immagine a presentare Ecco il codice,., auspicabilmente, si può ottenere un certo uso fuori di esso

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

Se volete maggiori informazioni su questo. codice, ho una spiegazione dettagliata inazione sul mio blog.

3

qui è semplice esempio:

<?php 
    $your_text = "Helloooo Worldddd"; 

    $IMG = imagecreate(250, 80); 
    $background = imagecolorallocate($IMG, 0,0,255); 
    $text_color = imagecolorallocate($IMG, 255,255,0); 
    $line_color = imagecolorallocate($IMG, 128,255,0); 
    imagestring($IMG, 10, 1, 25, $your_text, $text_color); 
    imagesetthickness ($IMG, 5); 
    imageline($IMG, 30, 45, 165, 45, $line_color); 
    header("Content-type: image/png"); 
    imagepng($IMG); 
    imagecolordeallocate($IMG, $line_color); 
    imagecolordeallocate($IMG, $text_color); 
    imagecolordeallocate($IMG, $background); 
    imagedestroy($IMG); 
    exit; 
?> 
1

Qui è la mia funzione per creare un'immagine dinamica png con testo dinamico ... e può essere chiamato AS

<img src="create_image.php?s=008080_F_1000_200&t=Sample%20Image%20Drawn%20By%20PHP" alt="GD Library Example Image" > 

Qui è create_image.php che fornisce l'immagine richiesta ...

<?php 
$setting = isset($_GET['s']) ? $_GET['s'] : "FFF_111_100_100"; 
$setting = explode("_",$setting); 
$img = array(); 

switch ($n = count($setting)) { 
    case $n > 4 : 
    case 3: 
     $setting[3] = $setting[2]; 
    case 4: 
     $img['width'] = (int) $setting[2]; 
     $img['height'] = (int) $setting[3]; 
    case 2: 
     $img['color'] = $setting[1]; 
     $img['background'] = $setting[0]; 
     break; 
    default: 
     list($img['background'],$img['color'],$img['width'],$img['height']) = array('F','0',100,100); 
     break; 
} 

$background = explode(",",hex2rgb($img['background'])); 
$color = explode(",",hex2rgb($img['color'])); 
$width = empty($img['width']) ? 100 : $img['width']; 
$height = empty($img['height']) ? 100 : $img['height']; 
$string = (string) isset($_GET['t']) ? $_GET['t'] : $width ."x". $height; 

header("Content-Type: image/png"); 
$image = @imagecreate($width, $height) 
    or die("Cannot Initialize new GD image stream"); 

$background_color = imagecolorallocate($image, $background[0], $background[1], $background[2]); 
$text_color = imagecolorallocate($image, $color[0], $color[1], $color[2]); 

imagestring($image, 5, 5, 5, $string, $text_color); 
imagepng($image); 
imagedestroy($image); 

function hex2rgb($hex) { 
    // Copied 
    $hex = str_replace("#", "", $hex); 

    switch (strlen($hex)) { 
    case 1: 
     $hex = $hex.$hex; 
    case 2: 
      $r = hexdec($hex); 
      $g = hexdec($hex); 
      $b = hexdec($hex); 
     break; 

    case 3: 
      $r = hexdec(substr($hex,0,1).substr($hex,0,1)); 
      $g = hexdec(substr($hex,1,1).substr($hex,1,1)); 
      $b = hexdec(substr($hex,2,1).substr($hex,2,1)); 
     break; 

    default: 
      $r = hexdec(substr($hex,0,2)); 
      $g = hexdec(substr($hex,2,2)); 
      $b = hexdec(substr($hex,4,2)); 
     break; 
    } 

    $rgb = array($r, $g, $b); 
    return implode(",", $rgb); 
} 
0

Ecco un esempio semplice da usare:

<?php 
    $your_text = "Helloooo Worldddd"; 

    $IMG = imagecreate(250, 80); 
    $background = imagecolorallocate($IMG, 0,0,255); 
    $text_color = imagecolorallocate($IMG, 255,255,0); 
    $line_color = imagecolorallocate($IMG, 128,255,0); 
    imagestring($IMG, 10, 1, 25, $your_text, $text_color); 
    imagesetthickness ($IMG, 5); 
    imageline($IMG, 30, 45, 165, 45, $line_color); 
    header("Content-type: image/png"); 
    imagepng($IMG); 
    imagecolordeallocate($IMG, $line_color); 
    imagecolordeallocate($IMG, $text_color); 
    imagecolordeallocate($IMG, $background); 
    imagedestroy($IMG); 
    exit; 
?>