2009-05-23 19 views
20

色、形、透明度などの引数をとり、PNG画像を出力するPHPで小さな関数を作成したい。 PHP GDライブラリについて聞いたことがありますが、soon.media.mit.edu動的PNG画像を作成する

+0

リンク.......... – Pacerier

+0

@Pacerierこのような感じでした(https://web.archive.org/web/20090720063343/http://soon.media.mit.edu/masthead/images/hdr -research-landing.jpg)、色、テキスト、透明度が変化します提供されているパラメータが保留になっています。今、私たちは曇りやイグジットのようなサービスを持っていますが、それは新しいものでした! – apnerve

答えて

19

This is a good exampleのように創造的なものを作るには、these functionsを使って事実上すべてを行うことができます。可能であれば、記述したようなイメージを作成することは、グラデーション、ループ、色付きの奇妙なものを作成することによってかなり難しくなります。

いくつかのパラメータに基づいてイメージを動的に作成したい場合は、Photoshopで事前にイメージを作成してから、ユーザーが選択したイメージに基づいてオーバーレイすることができます。

あなたが楽しめることがたくさんあります。

編集:ああ、あなたの興味がある場合は、画像を作成し、エラーの原因となるgiving an invalid parameter shows some of the python codeです。コードのアイデアを得るのは良い場所です。

第2編集:これは私がこの種の技術で行ったことです。かなり前のことだったことに気をつけてください。それは、クエリ文字列に基づいて名前を受け取り、基本的に多くの乱数を持ついくつかのループを行います。

ここにソースコードがありますが、私は愚かなコード/引用についてお詫び申し上げます。これはかなり前に書かれました。私が約14歳になったとき(おそらく多くの欠陥)です。

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

ちょっと!それは本当にクールでした。私はこれがこれらの機能を使って達成できることを知らなかった。 – apnerve

+0

ああ、これは氷山の先端です。そこにはたくさんのことがあります。 – Sam152

+0

私は彼がPNG画像について尋ねたと思った? –

6

ここでは、クエリ文字列パラメータから受け入れられる2つの名前を持つイメージを生成するために以前に使用したコードを示します。私は準備された背景イメージを使用し、その上に名前を付けます。

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

は、あなたがこのような何かをページ上で生成された画像を表示するには:

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

これを行う方法を覚えておくのに必要なことは、まさに私が見たいものでした。 +1 – ThisBoyPerforms

4

ない「PHPでそれをやって、」しかし、あなたはいくつかの強力なコマンドラインのソフトウェアを呼び出すことができますへの直接の回答 PHP。特にImageMagickはキッチンシンクを含むすべてを引き出します。また、「帯域外」処理(すなわち、要求が完了した後に画像処理を実行する(ユーザーのフィードバックが速い)、または夜遅くにリソースが逼迫しているバッチで画像処理を実行するための「バックエンド」スクリプトで利用できるという利点がありますピーク時。

2

あなたが探しているのは完全ではありませんが、ダイナミックカラーレイヤーを透明な画像に挿入するためのスクリプトをまとめました.1色の画像「レイヤー」を設定し、 。。それ進カラーコードあなたのレイヤースクリプトの再色とは、ここで提示するように、1枚の画像にそれらをマージするコードです。うまくいけば、あなたはそれのうち、いくつかの使用を得ることができます

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

あなたはそれについての詳細な情報が必要な場合。コード、私は詳細なexplaを持っている私のblogの侵入。ここ

3

は簡単な例である:ここでは

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

は、ダイナミックテキストでダイナミックなPNGイメージを作成するために私の関数であります... そして、ここで

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

AS-呼び出すことができますが、要求された画像を提供create_image.phpです...ここで

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

は、使用する簡単な例です:ダウン

<?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; 
?> 
関連する問題