imagenes imagen crear php image png

php - crear - Crea una imagen PNG dinámica



crear thumbnails php (8)

Aquí está el código que usé antes para generar una imagen con dos nombres, que se aceptan a partir de los parámetros de la cadena de consulta. Utilizo una imagen de fondo preparada y pongo los nombres encima.

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

Para mostrar la imagen generada en la página, haga algo como esto:

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

Quiero crear una pequeña función en PHP que incluya argumentos como el color, la forma, la transparencia, etc. y produzca una imagen PNG. Escuché sobre la biblioteca PHP GD pero quiero saber cómo se puede crear algo tan creativo como soon.media.mit.edu


Aquí está mi función para crear una imagen png dinámica con texto dinámico ... Y se puede llamar como-

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

Aquí está create_image.php que proporciona la imagen solicitada ...

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


Aquí hay un ejemplo simple para usar:

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


Aquí hay un ejemplo simple:

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


No es exactamente lo que estás buscando, pero armé un script para insertar capas de colores dinámicos en imágenes transparentes. Lo configura con "capas" de imágenes de un solo color y, para ejecutarlo, aliméntelo con un código de color hexadecimal. La secuencia de comandos cambia el color de sus capas y las combina en una imagen para presentar. Aquí está el código; Espero que puedas sacar algo de uso de ello.

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

Si desea más información sobre ese código, tengo una explicación detallada en mi blog .


No es una respuesta directa a "hacerlo en PHP", pero puede llamar a algún software potente de línea de comandos desde PHP. En particular, ImageMagick dibujará todo, incluido el fregadero de la cocina. También tiene la ventaja de estar disponible para las secuencias de comandos de "back-end" para procesamiento "fuera de banda" (es decir, realizar el procesamiento de imágenes después de que se complete la solicitud (comentarios más rápidos del usuario) o tarde en la noche en lotes cuando los recursos son escasos las horas punta.


Puedes usar Imagick también. Puede ser mejor en cuanto a rendimiento que la biblioteca 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();

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


Este es un buen ejemplo , puede hacer virtualmente todo usando estas funciones . Aunque es posible, crear una imagen como la que describiste sería bastante difícil, ya que he hecho algunas cosas raras con gradientes, bucles y colores.

Si desea crear una imagen así de forma dinámica en función de algunos parámetros, siempre puede crear las imágenes de antemano en photoshop y luego superponerlas según lo que el usuario seleccione.

Hay mucha diversión que puedes tener.

Edición: Ah, por cierto, si su interés por dar un parámetro no válido muestra parte del código de Python que es responsable de crear la imagen y causar el error. Sería un buen lugar para tener una idea del código.

Segunda edición: Esto es algo que he hecho con este tipo de tecnología. Ten en cuenta que fue hace bastante tiempo. Acepta un nombre basado en la cadena de consulta y, básicamente, hace unos cuantos bucles con muchos números aleatorios.

Aquí está el código fuente, me disculpo por cualquier código / citas estúpidas. Esto fue escrito hace bastante tiempo, cuando tenía unos 14 años, creo (probablemente muchas fallas).

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