设计动量论坛's Archiver

ofly 发表于 2008-8-15 13:11

用PHP把TXT转换为JPG

  朋友说他的老式MP4不能看小时,但是能浏览图片,想把小说转换为图片在MP4上观看。PHP这样的超级语言最适于完成这样的任务了--不需要包装、快速实现。p*Q%Jx W#[xI
oPN$TE
  完成这个功能的PHP程序非常简单,就是建立一块空白的画布,把小说的文字写一页在布上,然后把图片保存为文件,再写下一页,直到小说写完。
(Gv*ujl:nL
lOp6v2x? Tj   建立画布的语句是$im=imagecreate(320, 240);建立一个320*240的画布,也可以通过imagecreatefromjpeg等函数建立有背景图片的底画。
`+}'g(lo4N0O}ta#d
9_vxkw+p   写字的语句是imagettftext($im, 12, 0, 0, ($line+1)*24-6, $color, $fnt, $s);根据行间距计算位置输出文字。&t+~ Q?L)[~&m b

9@-n$EpsyAW   特别注意的是imagettftext函数的文字中的汉字需要使用UTF-8编码,如何把GB转换为UTF-8我不知道,如果你有好办法请一定教教我。我的办法是用PHP写个简单脚本把所有的汉字输出到一个文本文件中,汉字之间用一个|分隔,命名为gbk.txt,在WINDOWS XP里面用记事本打开,另存为utf-8.txt,编码选为UTF-8即可。需要转换的时候利用这两个文件作为字典进行翻译。7gU6p]t3Y3@2n
;kqB*qG9l
完整程序如下:
?Ad iw5fx 9B$WJ!cG
<?phpJ`#mn@ zz
//指定文件名★可以修改1/2
s'NXCnfAR8`;cA $ifn='红楼梦.txt';rs?\&X mU"b

/QKy ve //读出两个编码的字符集合文本
s D/zj Y4O@/M+J8T $gb=file("gbk.txt"); :Ls%ug)C!bf!V&d
$gb=explode("|",$gb[0]); 8Gp3@Y?8Oc
$utf=file("utf-8.txt");
}:P8z4}W $utf=explode("|",$utf[0]); &`i$`on bg:@;L
//为了方便查询,把$gb数组的 key 与 values 交换;
T:[ P/Zt4W2H $gb=array_flip($gb); T%xl s5gh
//--------全局变量$utf,$gb供函数gb2utf8使用
#j]S;u2Q#A$Z 7?;{$?'t+c:`a
//设定字体★可以修改2/2
QFb p%iv\n $fnt="c:/windows/fonts/simsun.ttc"; IhHV8[ FJSC9i

R2fE9u$do //打开文本文件;D ] S'~/l S
$str=file_get_contents($ifn);r"x,G9U1dX IA"S*I
fdOjhy
//循环输出
tzcjOp!T7msH"J $page=1;FYLUk f2tt
while($str){U P}G$qI |P
$im=imagecreate(320, 240);1C1i i$T ra
$color=imagecolorallocate($im, 0,0,0); l._ u(Ke*ntC
$color=imagecolorallocate($im, 255,255,255);
2pexW#j\+q.i;|0R $line=0;G!a`j3RG*U0W1Yb
while ($str && $line<=9){
*`AY)nvw   $s='';0a4p$zm/ix
  $len=0;
i HZ)b;s4Y#H   while($str && $len<=38){&?I T$H1HX9J
   $c=substr($str,0,1);-EF;Q AH8Fv+f
   $str=substr($str,1);
~0dL)J!t&b%H6\X    if (ord($c)==10){$len=99;}
D3Gx d,?    else{@yH2@rd
    if (ord($c)!=13) {$s.=$c;$len++;};aaT2D1sk-n${6V
    if (ord($c)>=128) {
,i0pYYA mt      $c=substr($str,0,1);
b G ~[aU      $str=substr($str,1);2y/`q]m@ M
     $s.=$c;"m&~(ZhQ,E
     $len++;
(V y9z XW     }.o&x$WKh!Te
   }
F x#R;R3v9Z   } aNt!jJj*t@
echo "$s\n";
K/Vqb[(ti.? C9w"f   $s=gbk2utf8($s);
/uj)YC3t n,I   imagettftext($im, 12, 0, 0, ($line+1)*24-6, $color, $fnt, $s);
&Q8~6M4DC W3s#bx   $line++; f#O8V(D/R6l
}J+Lf[4?n
$ofn=sprintf("%s%05d.jpg", $ifn, $page);
sg o*MLv echo "========================================输出文件 $ofn\n"; t[;R)o Q6mTw)]
imagejpeg($im, $ofn);\{ r`@i1~h'h
imagedestroy($im);*}\Zi*m'Tn}*O
$page++;_+S*i(R/b;[|
}
l }^ZXv*rht
6e z9x(W%dk/HxP //编码转换函数
.v)vP l8e(Y(Iy ymfB+M function gbk2utf8($string)
7\{ iVL#U { }.U?r v
global $gb,$utf;
|,Dcmv+B^#~ $ut="";
]0l~EuJ while ($string){ pn'rytMWY.^7O1l
$st=substr($string,0,1);
3|Z6P`+T:{ $string=substr($string,1); L#~ S,Q \}R
if (ord($st)<128){
*~t0^%a4m%w#P"Csp-\ //单字节直接送回 5Q:E0JO6L!z7N5z\#y#p
$ut.=$st;
!Z`V%C;z9J*U2s#@ } else { a$G6a'E:@{1Y
//双字节的处理 ]t2E@"c1rD#Uxt
$st.=substr($string,0,1);
y&mk;q[ $string=substr($string,1); kY QVAu
$ut.=$utf[$gb[$st]];
6C\.Ib&ef } J2X,Q1X!sJ-MD!q_ q
} *G ~(ms!uf
return $ut;
}F1X\dV+Z4Z } }2Ij2{\ I'rE!X
?>

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.