【问题标题】:Create a dynamic PNG image创建动态 PNG 图像
【发布时间】:2010-10-28 10:08:53
【问题描述】:

我想在 PHP 中创建一个小函数,它接受颜色、形状、透明度等参数并输出 PNG 图像。我听说过 PHP GD 库,但我想知道如何创建像 soon.media.mit.edu 这样有创意的东西

【问题讨论】:

标签: php image png


【解决方案1】:

This is a good example,您几乎可以使用these functions 完成所有操作。虽然可能,但创建一个像你描述的那样的图像会非常困难,因为我用渐变、循环和颜色做了一些奇怪的东西。

如果您想根据某些参数动态制作这样的图像,您始终可以事先在 Photoshop 中创建图像,然后根据用户选择的内容叠加它们。

您可以享受很多乐趣。

编辑:哦,顺便说一句,如果您有兴趣 giving an invalid parameter shows some of the python code 负责创建图像并导致错误。这是了解代码的好地方。

第二次编辑:这只是我用这种技术所做的事情。请记住,这是很久以前的事了。它接受基于查询字符串的名称,并且基本上会执行一些包含大量随机数的循环。

这是源代码,对于任何愚蠢的代码/引用,我深表歉意。这是很久以前写的,我相信当时我大约 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);

?>

【讨论】:

  • 嘿!那真的很酷。我从来不知道可以使用这些函数来实现。
  • 哦,是的,这只是冰山一角。那里有很多。
  • 我以为他问的是 PNG 图片?
  • 不要在最后一行使用“imagejpeg”,而是对 PNG 图像使用“imagepng”
【解决方案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" />

【讨论】:

    【解决方案3】:

    不是“用 PHP 做”的直接答案,但您可以调用一些强大的命令行软件 PHP。特别是ImageMagick 将绘制包括厨房水槽在内的所有内容。它还具有可用于“带外”处理的“后端”脚本(即,在请求完成后执行图像处理(更快的用户反馈)或在深夜资源紧张时分批执行的优势。高峰时间。

    【讨论】:

      【解决方案4】:

      这是一个简单的例子:

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

      【讨论】:

        【解决方案5】:

        这并不完全是您要查找的内容,但我编写了一个脚本以将动态颜色层插入透明图像。你用单色图像“层”设置它并运行它,给它一个十六进制颜色代码。该脚本重新着色您的图层并将它们合并为一个图像以呈现。这是代码;希望你能从中得到一些用处。

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

        如果您想了解有关该代码的更多信息,我的blog 上有详细说明。

        【讨论】:

          【解决方案6】:

          这是我使用动态文本创建动态 png 图像的功能... 并且可以称为-

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

          这里是 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); 
          }
          

          【讨论】:

            【解决方案7】:

            这是一个简单的使用示例:

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

            【讨论】:

              【解决方案8】:

              您也可以使用Imagick。它在性能方面可能比 GD 库更好。

              // Create new object
              $im = new Imagick();
              
              // Create new image with properties
              $im->newImage( 1000, 1000, '#FF0000' );
              
              // Write texts on it
              $text_draw = new ImagickDraw();
              $text_draw->setFont( 'path/to/font' );
              $text_draw->setFontSize( 150 );
              $text_draw->setStrokeColor('#fff');
              $text_draw->setFillColor('#C0C0C0');
              
              $im->setImageFormat( "png" );
              $im->writeImage( 'path/to/save/filename.png' );
              $img->destroy();
              

              来源:http://coderaweso.me/php-imagick-create-images-texts/

              【讨论】:

                猜你喜欢
                • 2011-01-29
                • 1970-01-01
                • 1970-01-01
                • 2010-09-26
                • 1970-01-01
                • 2012-03-22
                • 2012-09-25
                • 2020-07-25
                • 2019-10-20
                相关资源
                最近更新 更多