在图片上加文字是论坛,博客,新闻网站上最喜欢用的功能,防止盗图。这里看看代码是如何实现的。
首先还是upload_image.php这个文件,注意这里的caption文本框中输入的内容最终会写到图片上面
<?php //修改图片效果 $db = mysql_connect(\'localhost\',\'root\',\'Ctrip07185419\') or die(\'can not connect to database\'); mysql_select_db(\'moviesite\',$db) or die(mysql_error($db)); //上传文件的路径 $dir = \'D:\Serious\phpdev\test\images\'; //设置环境变量 //putenv(\'GDFONTPATH=\'.\'C:\Windows\Fonts\'); $font = "C:\Windows\Fonts\arial.ttf"; //upload_image.php页面传递过来的参数,如果是上传图片 if($_POST[\'submit\'] == \'Upload\') { if($_FILES[\'uploadfile\'][\'error\'] != UPLOAD_ERR_OK) { switch($_FILES[\'uploadfile\'][\'error\']) { case UPLOAD_ERR_INI_SIZE: die(\'The uploaded file exceeds the upload_max_filesize directive\'); break; case UPLOAD_ERR_FORM_SIZE: die(\'The upload file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form\'); break; case UPLOAD_ERR_PARTIAL: die(\'The uploaded file was only partially uploaded\'); break; case UPLOAD_ERR_NO_FILE: die(\'No file was uploaded\'); break; case UPLOAD_ERR_NO_TMP_DIR: die(\'The server is missing a temporary folder\'); break; case UPLOAD_ERR_CANT_WRITE: die(\'The server fail to write the uploaded file to the disk\'); break; case UPLOAD_ERR_EXTENSION: die(\'The upload stopped by extension\'); break; } } $image_caption = $_POST[\'caption\']; $image_username = $_POST[\'username\']; $image_date = date(\'Y-m-d\'); list($width,$height,$type,$attr) = getimagesize($_FILES[\'uploadfile\'][\'tmp_name\']); $error = \'The file you upload is not a supported filetype\'; switch($type) { case IMAGETYPE_GIF: $image = imagecreatefromgif($_FILES[\'uploadfile\'][\'tmp_name\']) or die($error); break; case IMAGETYPE_JPEG: $image = imagecreatefromjpeg($_FILES[\'uploadfile\'][\'tmp_name\']) or die($error); break; case IMAGETYPE_PNG: $image = imagecreatefrompng($_FILES[\'uploadfile\'][\'tmp_name\']) or die($error); break; default: break; } $query = \'insert into images(image_caption,image_username,image_date) values("\'.$image_caption.\'" , "\'.$image_username.\'","\'.$image_date.\'")\'; $result = mysql_query($query,$db) or die(mysql_error($db)); $last_id = mysql_insert_id(); // $imagename = $last_id.\'.jpg\'; // imagejpeg($image,$dir.\'/\'.$imagename); // imagedestroy($image); $image_id = $last_id; imagejpeg($image , $dir.\'/\'.$image_id.\'.jpg\'); imagedestroy($image); } else //如果图片已经上传,则从数据库中取图片名字 { $query = \'select image_id,image_caption,image_username,image_date from images where image_id=\'.$_POST[\'id\']; $result = mysql_query($query,$db) or die(mysql_error($db)); extract(mysql_fetch_assoc($result)); list($width,$height,$type,$attr) = getimagesize($dir.\'/\'.$image_id.\'.jpg\'); } //如果是保存图片 if($_POST[\'submit\'] == \'Save\') { if(isset($_POST[\'id\']) && ctype_digit($_POST[\'id\']) && file_exists($dir.\'/\'.$_POST[\'id\'].\'.jpg\')) { $image = imagecreatefromjpeg($dir.\'/\'.$_POST[\'id\'].\'.jpg\'); } else { die(\'invalid image specified\'); } $effect = (isset($_POST[\'effect\'])) ? $_POST[\'effect\'] : -1; switch($effect) { case IMG_FILTER_NEGATE: imagefilter($image , IMG_FILTER_NEGATE); //将图像中所有颜色反转 break; case IMG_FILTER_GRAYSCALE: imagefilter($image , IMG_FILTER_GRAYSCALE); //将图像转换为灰度的 break; case IMG_FILTER_EMBOSS: imagefilter($image , IMG_FILTER_EMBOSS); //使图像浮雕化 break; case IMG_FILTER_GAUSSIAN_BLUR: imagefilter($image , IMG_FILTER_GAUSSIAN_BLUR); //用高斯算法模糊图像 break; } if(isset($_POST[\'emb_caption\'])) { imagettftext($image , 12 , 0 , 20 , 20 , 0 , $font , $image_caption); } imagejpeg($image , $dir.\'/\'.$_POST[\'id\'].\'.jpg\' , 100); ?> <html> <head> <title>Here is your pic!</title> </head> <body> <h1>Your image has been saved!</h1> <img src="images/<?php echo $_POST[\'id\'];?>.jpg" alt="" /> </body> </html> <?php } else { ?> <html> <head> <title>Here is your pic!</title> </head> <body> <h1>So how does it feel to be famous?</h1> <p>Here is the picture you just uploaded to your servers:</p> <!--<img src="images/<?php echo $imagename;?>" alt="" style="float:left;" />--> </body> </html> <?php if($_POST[\'submit\'] == \'Upload\') { $imagename = \'images/\'.$image_id.\'.jpg\'; } else { $imagename = \'image_effect.php?id=\'.$image_id.\'&e=\'.$_POST[\'effect\']; if(isset($_POST[\'emb_caption\'])) { $imagename .= \'&capt=\'.urlencode($image_caption); } } ?> <img src="<?php echo $imagename;?>" style="float:left;" alt="" /> <table> <tr> <td>Image save as:</td> <td><?php $image_id?></td> </tr> <tr> <td>Height:</td> <td><?php echo $height;?></td> </tr> <tr> <td>Widht:</td> <td><?php echo $width;?></td> </tr> <tr> <td>Upload date:</td> <td><?php echo $image_date;?></td> </tr> </table> <p>You may apply a special effect to your image from the list of option below. Note:saving an image with any of the filters applied <em>can be undone</em> </p> <form action="<?php echo $_SERVER[\'PHP_SELF\'];?>" method="post"> <div> <input type="hidden" name="id" value="<?php echo $image_id;?>"/> Filter:<select name="effect" id=""> <option value="-1">None</option> <?php echo \'<option value="\'.IMG_FILTER_GRAYSCALE.\'" \'; if(isset($_POST[\'effect\']) && $_POST[\'effect\'] == IMG_FILTER_GRAYSCALE) { echo \'selected="selected"\'; } echo \' >Black and white</option>\'; echo \'<option value="\'.IMG_FILTER_GAUSSIAN_BLUR.\'"\'; if(isset($_POST[\'effect\']) && $_POST[\'effect\'] == IMG_FILTER_GAUSSIAN_BLUR) { echo \' selected="selected"\'; } echo \'>Blur</option>\'; echo \'<option value="\'.IMG_FILTER_EMBOSS.\'"\'; if(isset($_POST[\'effect\']) && $_POST[\'effect\'] == IMG_FILTER_EMBOSS) { echo \'selected="selected"\'; } echo \'>Emboss</option>\'; echo \'<option value="\'.IMG_FILTER_NEGATE.\'"\'; if(isset($_POST[\'effect\']) && $_POST[\'effect\'] == IMG_FILTER_NEGATE) { echo \'selected="selected"\'; } echo \'>Negative</option>\'; ?> </select><br /> <?php echo \'<input type="checkbox" name="emb_caption"\'; if(isset($_POST[\'emb_caption\'])) { echo \' checked="checked"\'; } echo \' />Embed caption in image?\'; ?> <input type="submit" value="Preview" name="submit" /><br /><br /> <input type="submit" value="Save" name="submit" /> </div> </form> <?php } ?>
注意这里有个问题,选择字体的时要加上绝对路径并且带上后缀.tff,否则的话是看不到图片的,下面的代码是image_effect.php
<?php //修改图片效果 $db = mysql_connect(\'localhost\',\'root\',\'Ctrip07185419\') or die(\'can not connect to database\'); mysql_select_db(\'moviesite\',$db) or die(mysql_error($db)); //上传文件的路径 $dir = \'D:\Serious\phpdev\test\images\'; //设置环境变量 //putenv(\'GDFONTPATH=\'.\'C:\Windows\Fonts\'); $font = "C:\Windows\Fonts\arial.ttf"; //upload_image.php页面传递过来的参数,如果是上传图片 if($_POST[\'submit\'] == \'Upload\') { if($_FILES[\'uploadfile\'][\'error\'] != UPLOAD_ERR_OK) { switch($_FILES[\'uploadfile\'][\'error\']) { case UPLOAD_ERR_INI_SIZE: die(\'The uploaded file exceeds the upload_max_filesize directive\'); break; case UPLOAD_ERR_FORM_SIZE: die(\'The upload file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form\'); break; case UPLOAD_ERR_PARTIAL: die(\'The uploaded file was only partially uploaded\'); break; case UPLOAD_ERR_NO_FILE: die(\'No file was uploaded\'); break; case UPLOAD_ERR_NO_TMP_DIR: die(\'The server is missing a temporary folder\'); break; case UPLOAD_ERR_CANT_WRITE: die(\'The server fail to write the uploaded file to the disk\'); break; case UPLOAD_ERR_EXTENSION: die(\'The upload stopped by extension\'); break; } } $image_caption = $_POST[\'caption\']; $image_username = $_POST[\'username\']; $image_date = date(\'Y-m-d\'); list($width,$height,$type,$attr) = getimagesize($_FILES[\'uploadfile\'][\'tmp_name\']); $error = \'The file you upload is not a supported filetype\'; switch($type) { case IMAGETYPE_GIF: $image = imagecreatefromgif($_FILES[\'uploadfile\'][\'tmp_name\']) or die($error); break; case IMAGETYPE_JPEG: $image = imagecreatefromjpeg($_FILES[\'uploadfile\'][\'tmp_name\']) or die($error); break; case IMAGETYPE_PNG: $image = imagecreatefrompng($_FILES[\'uploadfile\'][\'tmp_name\']) or die($error); break; default: break; } $query = \'insert into images(image_caption,image_username,image_date) values("\'.$image_caption.\'" , "\'.$image_username.\'","\'.$image_date.\'")\'; $result = mysql_query($query,$db) or die(mysql_error($db)); $last_id = mysql_insert_id(); // $imagename = $last_id.\'.jpg\'; // imagejpeg($image,$dir.\'/\'.$imagename); // imagedestroy($image); $image_id = $last_id; imagejpeg($image , $dir.\'/\'.$image_id.\'.jpg\'); imagedestroy($image); } else //如果图片已经上传,则从数据库中取图片名字 { $query = \'select image_id,image_caption,image_username,image_date from images where image_id=\'.$_POST[\'id\']; $result = mysql_query($query,$db) or die(mysql_error($db)); extract(mysql_fetch_assoc($result)); list($width,$height,$type,$attr) = getimagesize($dir.\'/\'.$image_id.\'.jpg\'); } //如果是保存图片 if($_POST[\'submit\'] == \'Save\') { if(isset($_POST[\'id\']) && ctype_digit($_POST[\'id\']) && file_exists($dir.\'/\'.$_POST[\'id\'].\'.jpg\')) { $image = imagecreatefromjpeg($dir.\'/\'.$_POST[\'id\'].\'.jpg\'); } else { die(\'invalid image specified\'); } $effect = (isset($_POST[\'effect\'])) ? $_POST[\'effect\'] : -1; switch($effect) { case IMG_FILTER_NEGATE: imagefilter($image , IMG_FILTER_NEGATE); //将图像中所有颜色反转 break; case IMG_FILTER_GRAYSCALE: imagefilter($image , IMG_FILTER_GRAYSCALE); //将图像转换为灰度的 break; case IMG_FILTER_EMBOSS: imagefilter($image , IMG_FILTER_EMBOSS); //使图像浮雕化 break; case IMG_FILTER_GAUSSIAN_BLUR: imagefilter($image , IMG_FILTER_GAUSSIAN_BLUR); //用高斯算法模糊图像 break; } if(isset($_POST[\'emb_caption\'])) { imagettftext($image , 12 , 0 , 20 , 20 , 0 , $font , $image_caption); } imagejpeg($image , $dir.\'/\'.$_POST[\'id\'].\'.jpg\' , 100); ?> <html> <head> <title>Here is your pic!</title> </head> <body> <h1>Your image has been saved!</h1> <img src="images/<?php echo $_POST[\'id\'];?>.jpg" alt="" /> </body> </html> <?php } else { ?> <html> <head> <title>Here is your pic!</title> </head> <body> <h1>So how does it feel to be famous?</h1> <p>Here is the picture you just uploaded to your servers:</p> <!--<img src="images/<?php echo $imagename;?>" alt="" style="float:left;" />--> </body> </html> <?php if($_POST[\'submit\'] == \'Upload\') { $imagename = \'images/\'.$image_id.\'.jpg\'; } else { $imagename = \'image_effect.php?id=\'.$image_id.\'&e=\'.$_POST[\'effect\']; if(isset($_POST[\'emb_caption\'])) { $imagename .= \'&capt=\'.urlencode($image_caption); } } ?> <img src="<?php echo $imagename;?>" style="float:left;" alt="" /> <table> <tr> <td>Image save as:</td> <td><?php $image_id?></td> </tr> <tr> <td>Height:</td> <td><?php echo $height;?></td> </tr> <tr> <td>Widht:</td> <td><?php echo $width;?></td> </tr> <tr> <td>Upload date:</td> <td><?php echo $image_date;?></td> </tr> </table> <p>You may apply a special effect to your image from the list of option below. Note:saving an image with any of the filters applied <em>can be undone</em> </p> <form action="<?php echo $_SERVER[\'PHP_SELF\'];?>" method="post"> <div> <input type="hidden" name="id" value="<?php echo $image_id;?>"/> Filter:<select name="effect" id=""> <option value="-1">None</option> <?php echo \'<option value="\'.IMG_FILTER_GRAYSCALE.\'" \'; if(isset($_POST[\'effect\']) && $_POST[\'effect\'] == IMG_FILTER_GRAYSCALE) { echo \'selected="selected"\'; } echo \' >Black and white</option>\'; echo \'<option value="\'.IMG_FILTER_GAUSSIAN_BLUR.\'"\'; if(isset($_POST[\'effect\']) && $_POST[\'effect\'] == IMG_FILTER_GAUSSIAN_BLUR) { echo \' selected="selected"\'; } echo \'>Blur</option>\'; echo \'<option value="\'.IMG_FILTER_EMBOSS.\'"\'; if(isset($_POST[\'effect\']) && $_POST[\'effect\'] == IMG_FILTER_EMBOSS) { echo \'selected="selected"\'; } echo \'>Emboss</option>\'; echo \'<option value="\'.IMG_FILTER_NEGATE.\'"\'; if(isset($_POST[\'effect\']) && $_POST[\'effect\'] == IMG_FILTER_NEGATE) { echo \'selected="selected"\'; } echo \'>Negative</option>\'; ?> </select><br /> <?php echo \'<input type="checkbox" name="emb_caption"\'; if(isset($_POST[\'emb_caption\'])) { echo \' checked="checked"\'; } echo \' />Embed caption in image?\'; ?> <input type="submit" value="Preview" name="submit" /><br /><br /> <input type="submit" value="Save" name="submit" /> </div> </form> <?php } ?>
这里如果我们写成下面这样
putenv(\'GDFONTPATH=\'.\'C:\Windows\Fonts\'); $font = "arial";
是看不到效果的,这里顺便提一下,火狐是最佳的开发工具,怎么讲呢,看看下面的对比吧。
火狐的提示是这样的:
图片没有截完整提示是:The image “http://localhost:81/test/image_effect.php?id=31&e=-1&capt=you+are+big+bitch” cannot be displayed because it contains errors.
谷歌浏览器的显示如下:
一个未能正确显示的图片,什么信息都没有。
再来看看大IE的,如下:
也能看到错误信息,但是一大堆乱码啊!
所以说开发人员好帮手还是火狐。