>php教程 >php手册 >源码:php文字转图片的类

源码:php文字转图片的类

WBOY
WBOY원래의
2016-06-06 20:08:461968검색

昨天在qq空间看见一篇“神奇的日志”,不同的访客看到同一张图片会显示对应访客的信息,用chrome 查看了下图片来源是个php文件; 基本原理就是 通过 php文件判断来源页面的url(url中包含qq号码),获取qq号码后通过腾讯的开放api接口,获取qq昵称和qq头像,

昨天在qq空间看见一篇“神奇的日志”,不同的访客看到同一张图片会显示对应访客的信息,用chrome 查看了下图片来源是个php文件;

基本原理就是 通过 php文件判断来源页面的url(url中包含qq号码),获取qq号码后通过腾讯的开放api接口,获取qq昵称和qq头像,然后用gb函数画图,输出

今天试着在网上找到一个文字转图片的程序,改吧改吧写了一个类似的程序,但是写完发了几篇日志才发现腾讯好像已经屏蔽掉外部图片在个人中心中显示了;

把改过的一个 php 文字转图片的类发上来给大家分享下,新手一枚代码改的不是很规整,见谅。。

文件名 Text2Img.class.php

<?php class Text2Img{
//$fontFile = 'msyh.ttc'; #字体文件名,请先拷贝一个字体到font目录下,然后修改此配置
private $LibiFontStyle = "mini.TTF";
private $LibiFontColor = "FF0000";
private $LibiBackColor = "FFFFFF";
private $haveBrLinker = "";
private $LibiWidth;
private $Message;
function __construct($options=array()){
foreach($options as $key=>$val){
if(!in_array($key,get_class_vars(get_class($this)))){
continue;
}else{
$this->$key=$val;
}
}
}
private function str_div($str, $width = 10){
$strArr = array();
$len = strlen($str);
$count = 0;
$flag = 0;
while($flag ';
if(ord($str[$flag]) > 128){
$count += 1;
$flag += 3;
}
else{
$count += 0.5;
$flag += 1 ;
}
if($count >= $width){
$strArr[] = substr($str, 0, $flag);
$str = substr($str, $flag);
$len -= $flag;
$count = 0;
$flag = 0;
}
}
$strArr[] = $str;
return $strArr;
}
private function str2rgb($str)
{
$color = array('red'=>0, 'green'=>0, 'blue'=>0);
$str = str_replace('#', '', $str);
$len = strlen($str);
if($len==6){
$arr=str_split($str,2);
$color['red'] = (int)base_convert($arr[0], 16, 10);
$color['green'] = (int)base_convert($arr[1], 16, 10);
$color['blue'] = (int)base_convert($arr[2], 16, 10);
return $color;
}
if($len==3){
$arr=str_split($str,1);
$color['red'] = (int)base_convert($arr[0].$arr[0], 16, 10);
$color['green'] = (int)base_convert($arr[1].$arr[1], 16, 10);
$color['blue'] = (int)base_convert($arr[2].$arr[2], 16, 10);
return $color;
}
return $color;
}
public function text2Img($text){
if($text==''){
$this->Message = "没有文字";
return false;
}
$text = substr($text, 0, 30000); #截取前一万个字符
$paddingTop = 20;
$paddingLeft = 15;
$paddingBottom = 20;
$copyrightHeight = 36;
$canvasWidth = 440;
$canvasHeight = $paddingTop + $paddingBottom + $copyrightHeight;
$fontSize = 12;
$lineHeight = intval($fontSize * 1.8);
$textArr = array();
$tempArr = explode("\n", trim($text));
$j = 0;
foreach($tempArr as $v){
$arr = $this->str_div($v, 25);
$textArr[] = array_shift($arr);
foreach($arr as $v){
$textArr[] = $this->haveBrLinker . $v;
$j ++;
if($j > 100){ break; }
}
$j ++;
if($j > 100){ break; }
}
$textLen = count($textArr);
$canvasHeight = $lineHeight * $textLen + $canvasHeight;
$im = imagecreatetruecolor($canvasWidth, $canvasHeight); #定义画布
$colorArray = $this->str2rgb($this->LibiBackColor);
imagefill($im, 0, 0, imagecolorallocate($im, $colorArray['red'], $colorArray['green'], $colorArray['blue']));
$colorArray = $this->str2rgb('666666');
$colorLine = imagecolorallocate($im, $colorArray['red'], $colorArray['green'], $colorArray['blue']);
$padding = 3;
$x1 = $y1 = $x4 = $y2 = $padding;
$x2 = $x3 = $canvasWidth - $padding - 1;
$y3 = $y4 = $canvasHeight - $padding - 1;
imageline($im, $x1, $y1, $x2, $y2, $colorLine);
imageline($im, $x2, $y2, $x3, $y3, $colorLine);
imageline($im, $x3, $y3, $x4, $y4, $colorLine);
imageline($im, $x4, $y4, $x1, $y1, $colorLine);
//字体路径
if(!is_file($this->LibiFontStyle)){
$this->Message = "字体文件不存在!";
return false;
}
//写入四个随即数字
$colorArray = $this->str2rgb($this->LibiFontColor);
$fontColor = imagecolorallocate($im, $colorArray['red'], $colorArray['green'], $colorArray['blue']);
foreach($textArr as $k=>$text){
$offset = $paddingTop + $lineHeight * ($k + 1) - intval(($lineHeight-$fontSize) / 2);
imagettftext($im, $fontSize, 0, $paddingLeft, $offset, $fontColor, $this->LibiFontStyle, $text);
}
$fontColor = imagecolorallocate($im, 0, 0, 0);
$offset += 18;
$text = '----END----';
imagettftext($im, 10, 0, $paddingLeft, $offset, $fontColor, $this->LibiFontStyle, $text);
$offset += 18;
$fontColor = imagecolorallocate($im, 255, 0, 0);
$text = 'By Libi';
imagettftext($im, 10, 0, $paddingLeft + 310, $offset, $fontColor, $this->LibiFontStyle, $text);
header('Content-Type: image/png');
imagepng($im, $imgfile);
imagedestroy($im);
}
}
?>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.