I have a problem to put text into a image.
I have all letters in images on my folder named tekst.
Lets say I use $userinfo->name to get the user name and in this case the user is named zippo
Then I want the users name to return following HTML output:
<img src="tekst/z.png"><img src="tekst/i.png"><img src="tekst/p.png"><img src="tekst/p.png"><img src="tekst/o.png">
How can I do it with PHP to change each letter in the name to <img src="tekst/?.png>.
You can use this:
<?php
$name = "zippo";
for ($i = 0; $i < strlen($name); $i++) {
echo '<img src="tekst/' . $name[$i] . '.png">';
}
?>
Use str_split() function on your string and loop over result array as follows:
$letters = str_split($string);
foreach ($letters as $letter) {
echo '<img src="tekst/' . $letter . '.png" />';
}
try this one
$letters = str_split($string);
foreach ($letters as $letter) {
echo '<img src=".../tekst/' . $letter . '.png" />';
}
First you have to create a php file to convert your text to image :
<?php
/* image.php */
// Receive data
$char = $_GET['char'];
if(!empty($char)){
// This will get the first character from $char
$char = $char;
// Create a 100*30 image
$im = imagecreate(100, 30);
// White background and blue text
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);
// Write the string at the top left
imagestring($im, 5, 0, 0, $char, $textcolor);
// Output the image
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
}
?>
Image String http://php.net/manual/en/function.imagestring.php
Then split its name into chars
<?php
$string = 'abcdefgh'; // For example
$chars = str_split($string);
foreach ($chars as $char) {
echo '<img src="tekst/image.php?char='.$char.'"/>';
}
?>
str_split http://php.net/manual/en/function.str-split.php
GOOD LUCK
Related
I need to know if there's a quickest and efficient way to display one or more images if $value == $string
For example: I have an cell which only contains 3 single string: 'r o g', if user put ro it will output <img src="red.gif"> and <img src="orange.gif"> So it could be random if user insert gr then it will display <img src="green.gif"> and <img src="red.gif">
Right now I can only think something like...
<?php $red = "<img src="red.gif">";
$orange = "<img src="orange.gif">";
if( $cell1 == $red ){ echo $red;}
if( $cell1 == $red && $orange ){ echo $orange.$red;}
etc...
This method might works but has to provide too many possibility and I believe there's a shorter and efficient to do that, but I haven't got any idea because still I'm learning PHP
How about this approach?
<?php
//define all your images here
$images = [
'r' => 'red.png',
'g' => 'green.png',
'b' => 'blue.png',
'y' => 'yellow.png',
'o' => 'orange.png'
];
function output($input, $images) {
$parts = str_split($input);
foreach ($parts as $part) {
if (isset($images[$part]))
echo '<img src="' . $images[$part] . '">';
}
}
echo "rgb: \n";
output('rgb', $images);
echo "\n\nyor: \n";
output('yor', $images);
echo "\n\nxxy: \n";
output('xxy', $images);
Output:
rgb:
<img src="red.png"><img src="green.png"><img src="blue.png">
yor:
<img src="yellow.png"><img src="orange.png"><img src="red.png">
xxy:
<img src="yellow.png">
Try this approach:
for( $i = 0; $i <= strlen( $cell1 ); $i++ ) {
$char = substr( $cell1, $i, 1 );
switch ($char) {
case "r":
echo '<img src="red.gif">';
break;
case "o":
echo '<img src="orange.gif">';
break;
case "g":
echo '<img src="green.gif">';
break;
default:
break;
}
}
Here is the code that shows an example for 3 character inputs. $string can be the posted value.
$r = '<img src="red.gif">';
$y = '<img src="yellow.gif">';
$o = '<img src="orange.gif">';
$g = '<img src="green.gif">';
$string = 'ryo';
$length = strlen($string);
for ($i=0; $i<$length; $i++) {
echo ${''.$string[$i]};
}
How can I insert word-wrap function so that any word that is too long doesn't cut <div> border but line-returns itself?
The following is the variable I want to word-wrap
$body = nl2br(addslashes($_POST['body']));
try out these links:
Smarter word-wrap in PHP for long words?
http://php.net/manual/en/function.wordwrap.php
http://www.w3schools.com/php/func_string_wordwrap.asp
And a custom Function:
function smart_wordwrap($string, $width = 75, $break = "\n") {
// split on problem words over the line length
$pattern = sprintf('/([^ ]{%d,})/', $width);
$output = '';
$words = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
foreach ($words as $word) {
if (false !== strpos($word, ' ')) {
// normal behaviour, rebuild the string
$output .= $word;
} else {
// work out how many characters would be on the current line
$wrapped = explode($break, wordwrap($output, $width, $break));
$count = $width - (strlen(end($wrapped)) % $width);
// fill the current line and add a break
$output .= substr($word, 0, $count) . $break;
// wrap any remaining characters from the problem word
$output .= wordwrap(substr($word, $count), $width, $break, true);
}
}
// wrap the final output
return wordwrap($output, $width, $break);
}
$string = 'hello! toolongheretoolonghereooheeeeeeeeeeeeeereisaverylongword but these words are shorterrrrrrrrrrrrrrrrrrrr';
echo smart_wordwrap($string, 11) . "\n";
my code:
save this file as captcha.php
<?php
ob_start();
session_start();
if(!isset($_POST['submit'])){
echo "<form method=\"post\" action=\"captcha.php\">\n";
echo "<table border=\"0\" cellspacing=\"3\" cellpadding=\"3\">\n";
echo "<tr><td>Type The Letters You See Below Into the Box</td></tr>\n";
echo "<tr><td align=\"center\"><img src=\"image.php\"></td></tr>\n";
echo "<tr><td align=\"center\"><input type=\"text\" name=\"image\"></td></tr>\n";
echo "<tr><td align=\"center\"><input type=\"submit\" name=\"submit\" value=\"Check CAPTCHA\"></td></tr>\n";
echo "</table></form>\n";
}else {
$image = $_POST['image'];
if ($image == $_SESSION['string'])
{
echo "<b>Great success!</b>\n";
}
else
{
echo "<em>Failure!</em>\n";
}
}
ob_end_flush();
?>
save this file as image.php
<?php
session_start();
$img = imagecreatetruecolor(118,80);
$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
$red = imagecolorallocate($img, 255, 0, 0);
$grey = imagecolorallocate($img,150, 150, 150);
$pink = imagecolorallocate($img, 200, 0, 150);
$yellow = imagecolorallocate($img, 255, 246, 0);
function randomString($length){
$chars = "abcdefghijkmnopqrstuvwxyz023456789";
srand((double)microtime()*1000000);
$str = "";
$i = 0;
while($i <= $length){
$num = rand() % 33;
$tmp = substr($chars, $num, 1);
$str = $str . $tmp;
$i++;
}
return $str;
}
for($i=1;$i<=rand(1,5);$i++){
$color = (rand(1,2) == 1) ? $pink : $red;
imageline($img,rand(6,90),rand(6,40), rand(6,90)+6,rand(6,40)+6, $color);
}
imagefill($img, 0, 0, $yellow);
$string = randomString(rand(4,6));
$_SESSION['string'] = $string;
imagettftext($img, 20, 10, 10, 52, $black, "calibri.ttf", $string);
imagettftext($img, 20, 10, 12, 53, $grey, "calibri.ttf", $string);
header("Content-type: image/png");
imagepng($img);
imagedestroy($img);
?>
go to this address http://www.cufonfonts.com/en/font/12048/calibri and download the font and save it in the same root folder as the to .php files we just created.
NOTE!! THIS WILL WORK ON LOCALHOST BUT IM HAVING A PROBLEM WITH THE image.php file SHOWING UP LIKE THIS -> ����JFIF��>CREATOR: gd-jpeg v1.0 (using IJG JPEG v90), default quality ��C $.' ",#(7),01444'9=82<.342��C 2!!22222222222222222222222222222222222222222222222222��x"�����}!1AQa"q2���#B��R��$3br� .
THIS ONLY HAPPENS WHEN I TRY AND ADD IT TO THE CMS I CREATED. ALL I NEED TO KNOW IS WHY THIS IS HAPPENING I HAVE A FEELING ITS GOT SOMETHING TO DO WITH "header("Content-type: image/png");" although i could be way wrong. please help me. by the way im am trying to add a email form and have the captcha evaluate it
this is the form i am trying to insert the code into:
you can save it as form.php
<?php
$query = mysql_query("SELECT * FROM forms where id = '$formid'");
echo '<h2>'.mysql_result($query, 0, "title").'</h2>';
if(mysql_result($query, 0, "description") != "") {
echo '<p>'.mysql_result($query, 0, "description").'</p>';
}
error_reporting(E_ERROR);
?>
<form action="plugins/form_send.php" method="post" enctype="multipart/form-data" class="ajax" name="formplugin" id="form_<?php echo $formid; ?>">
<input name="formid" id="formid" type="hidden" value="<?php echo $formid; ?>" />
<p><span class="required">*</span> = required fields.</p>
<table border="0" cellspacing="5" cellpadding="5">
<?php
$field_labels_col = mysql_result($query, 0, "field_label");
$field_labels = array();
$field_labels =(explode('|', $field_labels_col));
$field_types_col = mysql_result($query, 0, "field_type");
$field_types = array();
$field_types =(explode('|', $field_types_col));
$field_option1_col = mysql_result($query, 0, "field_option1");
$field_option1 = array();
$field_option1 =(explode('|', $field_option1_col));
$field_option2_col = mysql_result($query, 0, "field_option2");
$field_option2 = array();
$field_option2 =(explode('|', $field_option2_col));
$field_validtype_col = mysql_result($query, 0, "field_validtype");
$field_validtype = array();
$field_validtype =(explode('|', $field_validtype_col));
$i = 0;
while (array_key_exists($i, $field_labels))
{
if(!isset($title)) { $title = ''; }
if($title != $field_labels[$i]) {
if(isset($field_labels[$i])) { $title = $field_labels[$i]; }
if(isset($title)) { $stripped = urlify($title); }
if(isset($field_types[$i])) { $type = $field_types[$i]; }
if(isset($field_option1[$i])) { $option1 = $field_option1[$i]; }
if(isset($field_option2[$i])) { $option2 = $field_option2[$i]; }
if(isset($field_validtype[$i])) { $valid = $field_validtype[$i]; }
echo '<tr>';
echo '<td align="left" valign="top">'.$title.'</td>';
echo '<td align="left" valign="top">';
// -- INPUT FIELDS --
if($type == "input") {
echo '<input name="'.$stripped.'" type="text" id="'.$stripped.'" size="'.$option1.'" maxlength="'.$option2.'" />';
if($valid != '') { echo '<span class="required">*</span>'; }
}
// -- TEXT AREAS --
if($type == "textarea") {
echo '<textarea name="'.$stripped.'" cols="'.$option1.'" rows="size="'.$option2.'"" id="'.$stripped.'"></textarea>';
}
// -- DROP DOWNS --
if($type == "dropdown") {
echo '<select name="'.$stripped.'" id="'.$stripped.'">';
$l = 0;
while (array_key_exists($l, $field_labels))
{
$thisoption = $field_option1[$l];
$thistitle = $field_labels[$l];
if($thistitle == $title) {
echo '<option value="'.$thisoption.'">'.$thisoption.'</option>';
}
$l++;
}
echo'</select>';
}
// -- RADIO BUTTONS --
if($type == "radiobutton") {
$l = 0;
while (array_key_exists($l, $field_labels))
{
$thisoption = $field_option1[$l];
$thistitle = $field_labels[$l];
$thisstripped = urlify($field_labels[$l]);
if($thistitle == $title) {
echo '<label><input type="radio" name="'.$thistitle.'" id="'.$thisstripped.'" value="'.$option1.'">'.$thisoption.'</label><br />';
}
$l++;
}
}
// -- SIMPLE YES / NO --
if($type == "yesno") {
echo '<label><input type="radio" name="'.$stripped.'" id="'.$stripped.'" value="Yes">Yes</label>';
echo '<label><input type="radio" name="'.$stripped.'" id="'.$stripped.'" value="No">No</label>';
}
// -- FILE UPLOADS --
if($type == "fileupload") {
echo '<input type="file" name="'.$stripped.'" id="'.$stripped.'" size="10"> (2mb limit)';
}
echo '</td>';
echo '</tr>';
}
$i++;
}
?>
<tr id="comment-div"><td colspan="2"><input name="user-comment" size="3" value="" /></td></tr>
<tr>
<td colspan="2">
<?php if(mysql_result($query, 0, "submit_text") != "") { ?>
<p><br /><?php echo mysql_result($query, 0, "submit_text"); ?></p>
<?php } ?>
<div id="result"><strong>Loading... please wait.</strong></div>
<!-- <input type="submit" name="button" id="button" value="<?php echo mysql_result($query, 0, "submit_button"); ?>" /> -->
</td>
</tr>
</table>
</form>
I guess the code you posted is not the whole file: try to remove all the content before and after <?php and ?> tags. You could even remove the final tag ?> (it is a style convention adopted by many, because of this very issue).
This affects every other file you are executing: every space, newline or other content outside the PHP tags or echoed by PHP is added to the image content, and ends up with the image corruption. Also PHP notices and warnings are an issue.
For clarity, the executed files format must be:
<?php // nothing before this line
// no other PHP tags till the end
... // PHP code with no echo calls
// no closing tag
In your code, you do:
header( "Content-type: image/png" );
# ...
echo "<img src='image/png;base64," . base64_encode( $x )."'>";
You are outputting a PNG sorrounding it with HTML, which inevitably corrupts your image content. You have to remove the HTML (echo $x) and use the image from another file, f.e. with
<img src="png_generator_script.php"/>
Or use the script as HTML page, removing
header( "Content-type: image/png" );
i was faced same problem . Remove all html tag it will 100% work..
save as php file .. index.php
<?php
/**
* PHP GD
* create a simple image with GD library
*
*/
//setting the image header in order to proper display the image
header("Content-Type: image/png");
//try to create an image
$im = #imagecreate(800, 600)
or die("Cannot Initialize new GD image stream");
//set the background color of the image
$background_color = imagecolorallocate($im, 0xFF, 0xCC, 0xDD);
//set the color for the text
$text_color = imagecolorallocate($im, 133, 14, 91);
//adf the string to the image
imagestring($im, 5, 300, 300, "I'm a pretty picture:))", $text_color);
//outputs the image as png
imagepng($im);
//frees any memory associated with the image
imagedestroy($im);
?>
instead of...
<html>
<head>
</head>
<body>
<?php
/**
* PHP GD
* create a simple image with GD library
*
*/
//setting the image header in order to proper display the image
header("Content-Type: image/png");
//try to create an image
$im = #imagecreate(800, 600)
or die("Cannot Initialize new GD image stream");
//set the background color of the image
$background_color = imagecolorallocate($im, 0xFF, 0xCC, 0xDD);
//set the color for the text
$text_color = imagecolorallocate($im, 133, 14, 91);
//adf the string to the image
imagestring($im, 5, 300, 300, "I'm a pretty picture:))", $text_color);
//outputs the image as png
imagepng($im);
//frees any memory associated with the image
imagedestroy($im);
?>
</body>
</html>
This code is working fine. I have tested it locally on chrome & firefox.
Okay, my problem here is I want to display the dynamically generated images on a webpage after they have been generated and provide a link for the user to use the image. When I try to echo the image:
echo '<img src="link/sig.php?username='.$_GET['username'].'&fakeparm=.png />';
The webpage displays the image fine, but with the addition of a million weird characters. Below is the image creation snippet.
$image_link = 'image.png';
$image = imagecreatefrompng($image_link);
$font_colour = imagecolorallocate($image, 0, 0, 0);
$font_size = 3;
$x = array('28', '80', '135', '188', '240');
$y = array('8', '29', '52', '77', '100');
$i = '0';
$a = '0';
foreach($stat as $s_key => $value){
imagestring($image, $font_size, $x[$a], $y[$i], $value[1], $font_colour);
$i++;
if($i == '5'){
$i = '0';
$a++;
}
}
imagestring($image, $font_size, '230', '100', 'Total:'. $overall[1], $font_colour);
imagestring($image, $font_size, '240', '75', '' . $username, $font_colour);
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
Value of $stat.
$stats = explode("\n", $website);
$overall = explode(",", $stats[0]);
$stat['att'] = explode(",", $stats[1]);
$stat['def'] = explode(",", $stats[2]);
$stat['str'] = explode(",", $stats[3]);
$stat['hp'] = explode(",", $stats[4]);
$stat['rng'] = explode(",", $stats[5]);
$stat['pry'] = explode(",", $stats[6]);
$stat['mag'] = explode(",", $stats[7]);
$stat['ck'] = explode(",", $stats[8]);
$stat['wc'] = explode(",", $stats[9]);
$stat['flt'] = explode(",", $stats[10]);
$stat['fsh'] = explode(",", $stats[11]);
$stat['fm'] = explode(",", $stats[12]);
$stat['cra'] = explode(",", $stats[13]);
$stat['smi'] = explode(",", $stats[14]);
$stat['min'] = explode(",", $stats[15]);
$stat['her'] = explode(",", $stats[16]);
$stat['ag'] = explode(",", $stats[17]);
$stat['th'] = explode(",", $stats[18]);
$stat['sl'] = explode(",", $stats[19]);
$stat['frm'] = explode(",", $stats[20]);
$stat['rc'] = explode(",", $stats[21]);
$stat['hun'] = explode(",", $stats[22]);
$stat['cs'] = explode(",", $stats[23]);
Note: Image is generated fine, everything works... I want to display the generated image on a webpage instead of being forwarded to the image itself...
You have not closing the img tag...
echo '<img src="link/sig.php?username='.$_GET['username'].'&fakeparm=.png" />';
instead of
echo '<img src="link/sig.php?username='.$_GET['username'].'&fakeparm=.png />';
Make sure there are no characters or browser output before you declare your headers. Not even spaces.
Otherwise the browser may try and read the image as html giving you your "million weird characters".
i'm trying to build a little module for a site that pulls 4 random photos from a folder on the server and presents them in a div. what's happening is the same 4 photos are being called. how do i get it to call 4 different photos?
heres the random.php file:
<?php
$folder = '.';
$extList = array();
$extList['jpg'] = 'image/jpeg';
$extList['jpeg'] = 'image/jpeg';
$img = null;
if (substr($folder,-1) != '/') {
$folder = $folder.'/';
}
if (isset($_GET['img'])) {
$imageInfo = pathinfo($_GET['img']);
if (
isset( $extList[ strtolower( $imageInfo['extension'] ) ] ) &&
file_exists( $folder.$imageInfo['basename'] )
) {
$img = $folder.$imageInfo['basename'];
}
} else {
$fileList = array();
$handle = opendir($folder);
while ( false !== ( $file = readdir($handle) ) ) {
$file_info = pathinfo($file);
if (
isset( $extList[ strtolower( $file_info['extension'] ) ] )
) {
$fileList[] = $file;
}
}
closedir($handle);
if (count($fileList) > 0) {
$imageNumber = time() % count($fileList);
$img = $folder.$fileList[$imageNumber];
}
}
if ($img!=null) {
$imageInfo = pathinfo($img);
$contentType = 'Content-type: '.$extList[ $imageInfo['extension'] ];
header ($contentType);
readfile($img);
} else {
if ( function_exists('imagecreate') ) {
header ("Content-type: image/png");
$im = #imagecreate (100, 100)
or die ("Can't initialize image stream");
$background_color = imagecolorallocate ($im, 255, 255, 255);
$text_color = imagecolorallocate ($im, 0,0,0);
imagestring ($im, 2, 5, 5, "IMAGE ERROR", $text_color);
imagepng ($im);
imagedestroy($im);
}
}
?>
here's how random.php is being called:
<?php
/* DATA */
$data = array(
array('COUNT', '88', 'Here are a few of them', '1, 2, 3, 4'),
);
?>
<div>
<table class="reop" border='0' width='100%' cellpadding='0' cellspacing='10'>
<?php
$count = 0;
foreach($data as $row) {
$class = ($count % 2 == 1 ? " class='alt'" : '');
echo "<tr$class>";
for($j = 0; $j < count($row); $j++) {
if ($j!=3) {
echo "<td class='cell_$j'>$row[$j]</td>";
} else {
// $avatar = '';
$array = preg_split('/,/', $row[$j], -1, PREG_SPLIT_NO_EMPTY);
foreach ($array as $val) {
$avatar .= '<img src="/staffpics/random.php"> ';
}
echo "<td class='cell_$j'>$avatar</td>";
}
}
echo '</tr>';
// $count++;
}
?>
</table>
when your page is displayed, most browsers will immediately request the four pictures.. nearly all at the same time. your code for "random" picking a picture is based on time() which returns a count of seconds since the begin of unixtime. executed 4 times within the same second it will also yield the same result 4 times.
your code:
$imageNumber = time() % count($fileList);
$img = $folder.$fileList[$imageNumber];
should be rewritten as:
// filelist starts with "0", count with "1" .. so we are off-by-one and first picture would never show without -1
$imageNumber = rand() % (count($fileList) - 1);
$img = $folder.$fileList[$imageNumber];
that way you will get "random" pictures.
Also, what Mister Lister commented is totally valid - your browser may also cache the picture and thus only request a picutre once and just display that one again and again using its cache.
to avoid this, replace any <img src="random.php"> with <img src="random.php?rand=<?= rand(); ?>">
But note:
your server may eventually return the same random number multiple times so eventually (rarely) you will end up with the same picture twice on the same page.
to fix that, you must completely rewrite your code.
the script rendering the page should decide which pictures to choose and ensure that no picture is displayed twice instead of just including a "give random picture" script, which is independent of the page rendered.
much easier, you could try this:
// find all images - case SenSItivE
$all_images = glob("/path/to/images/*.{jpeg|jpg|png|gif}", GLOB_BRACE);
// bring array in random order
shuffle($all_images);
// pick four random images - you may also use a for or foreach loop to iterate the array
list ($img1, $img2, $img3, $img4) = $all_images;
// write code to display four images here
Here is another way of fetching 4 random photos:
//randomize order
shuffle($fileList);
//get first 4 values of array
$randomPhotos = array_slice($fileList, 0, 4);
Please note, shuffle would change value order in your original array.
Call srand to seed your random number generator.