2009-05-23 47 views
20

Tôi muốn tạo một hàm nhỏ trong PHP có các đối số như màu sắc, hình dạng, độ trong suốt, v.v. và xuất ra hình ảnh PNG. Tôi đã nghe về thư viện GD của PHP nhưng tôi muốn biết cách tạo một thứ gì đó sáng tạo như soon.media.mit.eduTạo hình ảnh PNG động

+0

Link down .......... – Pacerier

+0

@Pacerier Nó trông giống như thế này (https://web.archive.org/web/20090720063343/http://soon.media.mit.edu/masthead/images/hdr -research-landing.jpg) nhưng thay đổi màu sắc, văn bản và minh bạch đang chờ xử lý thông số được cung cấp. Bây giờ chúng tôi có các dịch vụ như cloudinary và imgix nhưng sau đó nó là một cái gì đó mới! – apnerve

Trả lời

19

This is a good example, bạn có thể thực hiện mọi thứ bằng cách sử dụng these functions. Trong khi có thể, việc tạo ra một hình ảnh giống như hình bạn mô tả sẽ khá khó khăn bởi tôi đã làm một số công cụ kỳ lạ với gradient, vòng lặp và màu sắc.

Nếu bạn muốn tạo một hình ảnh như động dựa trên một số thông số, bạn luôn có thể tạo hình ảnh trước trong photoshop và sau đó phủ lên chúng dựa trên những gì người dùng chọn.

Có rất nhiều điều thú vị mà bạn có thể có.

Chỉnh sửa: Oh nhân tiện, nếu bạn quan tâm giving an invalid parameter shows some of the python code có trách nhiệm tạo hình ảnh và gây ra lỗi. Nó sẽ là một nơi tốt để có được một số ý tưởng về mã.

Chỉnh sửa lần 2: Đây chỉ là điều tôi đã làm với loại công nghệ này. Ghi nhớ nó đã được khá trong khi trước đây. Nó chấp nhận một tên dựa trên chuỗi truy vấn và về cơ bản có một vài vòng lặp với nhiều số ngẫu nhiên.

Đây là mã nguồn, tôi xin lỗi vì bất kỳ mã/báo giá ngu ngốc nào. Điều này được viết khá lâu trước đây, khi tôi khoảng 14 tuổi, tôi tin (có thể là nhiều sai sót).

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

này! điều đó thật tuyệt. Tôi không bao giờ biết điều này có thể đạt được bằng cách sử dụng các chức năng này. – apnerve

+0

Ồ vâng, đây là đỉnh của tảng băng trôi. Có rất nhiều thứ ở đó. – Sam152

+0

Tôi nghĩ anh ấy hỏi về hình ảnh PNG? –

6

Đây là mã mà tôi đã sử dụng trước đây để tạo hình ảnh có hai tên, được chấp nhận từ tham số chuỗi truy vấn. Tôi sử dụng một hình ảnh nền chuẩn bị và đặt tên trên đầu trang của nó.

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

Để hiển thị các hình ảnh được tạo ra trên trang bạn làm điều gì đó như thế này:

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

Chính xác những gì tôi cần xem để nhớ cách thực hiện điều này. +1 – ThisBoyPerforms

4

Không phải là một câu trả lời trực tiếp để "làm việc đó trong PHP" nhưng bạn có thể gọi một số phần mềm mạnh mẽ dòng lệnh từ PHP. Cụ thể là ImageMagick sẽ vẽ mọi thứ kể cả bồn rửa nhà bếp. Nó cũng có lợi thế là có sẵn cho các kịch bản "back-end" để xử lý "out-of-band" (ví dụ, thực hiện xử lý ảnh sau khi yêu cầu hoàn thành (phản hồi của người dùng nhanh hơn) hoặc muộn vào ban đêm khi các tài nguyên bị chặt chẽ trong quá trình Thời gian cao điểm

2

Không hoàn toàn những gì bạn đang tìm kiếm, nhưng tôi đã tập hợp một kịch bản để chèn lớp màu động vào hình ảnh trong suốt. Bạn thiết lập nó bằng hình ảnh một màu "lớp" và để chạy nó, nguồn cấp dữ liệu . nó một mã hex màu kịch bản tái màu sắc lớp của bạn và kết hợp chúng thành một hình ảnh để trình bày Dưới đây là mã;. hy vọng bạn có thể nhận được một số sử dụng ra khỏi nó

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

Nếu bạn muốn biết thêm thông tin về điều đó. mã, tôi có một bản chi tiết ination trên blog của tôi.

3

đây là ví dụ đơn giản:

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

Đây là chức năng của tôi để tạo hình ảnh png năng động với văn bản động ... Và có thể được gọi như-

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

Dưới đây là create_image.php cung cấp các hình ảnh theo yêu cầu ...

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

Dưới đây là một ví dụ đơn giản để sử dụng:

<?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; 
?> 
Các vấn đề liên quan