長文Weibo画像生成(画像を含めることができ、初期設定では最初の2枚のみ許可されています。また、この方法は画像のフォーマットが面倒なので、一時的に2枚の画像を設定します) 単純なテキストから画像を生成するのは比較的簡単です、ただし、リッチテキストが必要な場合は、比較的面倒です。もちろん、いくつかのソースコードが形成されていますが、コンポーネントのインストールが必要なものもあります(特定のWeb環境)。また、オープンソースのpaintyが良いようです。ここでは、p タグと img タグの画像生成を自分で実装していますが、これにも少し時間がかかります (主に画像のレイアウトに)。この機能はもともと WordPress で長い Weibo 投稿をプッシュするために使用され、コミュニケーションと学習のための機能にカプセル化されました。
- /**
- *
- * 長い Weibo 画像生成
- * @paramknown_type 記事 ID
- * @paramknown_type 記事コンテンツ (ID に従って取得でき、ここに値を直接渡します)
- * @paramknown_type $img_path 画像を保存するためのハード パス
- * @paramknown_type $img_path_url画像パスURL
- */
- function weibo_img_create($article_id,$text,$title='',$img_path='',$img_path_url=''){
- $font = dirname(__FILE__)."/droid.ttf";
- $pid = $article_id;
- //分割された p タグの処理
- $p_count = substr_count($text,'') //分割されたタグ番号
- ; $content = preg_replace("//isU","n",$text); //分割ラベル
- //画像画像ラベル処理
- $all_img_height = 0;
- if(preg_match_all( "/< img[^>]*src="([^"]*)"[^>]*>/", $content, $m)) {
- //最初の 2 枚の写真のみを撮影します
- $m[ 0] = array_slice($m[0],0,2);
- $m[1] = array_slice($m[1],0,2);
- //画像リソースを保存
- foreach($ m[1] as $i=>$src) {
- $imgs[] = $src;
- }
- //すべての画像を取得
- foreach($imgs as $i=>$image) {
- $ext = end(explode( ".", $image));
- $im = null;
- switch($ext) {
- case "gif":
- $im = imagecreatefromgif($image);
- Break;
- case "png" :
- $im = imagecreatefrompng($image);
- ブレーク;
- case "jpeg":
- $im = imagecreatefromjpeg($image);
- ブレーク;
- case "jpg":
- $im = imagecreatefromjpeg($image);
- ブレーク;
- }
- $imgs[$i] = array(
- '0'=>$im,
- 'height'=>floor(410/imagesx($im)*imagesy($im)), // 比例して拡大縮小します
- ) ;
- }
- $content =strip_tags($content,'');
- foreach($m[0] as $i=>$full) {
- //$replace_con = str_repeat ("n", ceil($imgs[$i]['height']/25));
- $content = str_replace_once($full, 'img-pos-pos'.$i,$content); //同じ
- //$img_pos[$i] = mb_strpos($content, 'img-pos-pos'.$i); //img タグを削除したテキストを使用します
- //$imgs[$ i]['img_pos '] = $img_pos[$i];
- $imgs[$i]['full'] = $full;
- //$content = str_replace('img-pos-pos'.$i, $replace_con, $content );
- //$all_img_height += $imgs[$i]['height'];
- }
- $all_img_height += $imgs[0]['height'];
- $content =strip_tags( $content.'endendend ');//追加された改行/スペースが削除されないようにします
- }
- $content =strip_tags($content);
- //$content = SpHtml2Text($content);//テキストに変換します
- $ content = autowrap(12 , 0, $font, $content, 395); // 自動行折り返し
- if(!empty($imgs)){
- foreach($imgs as $i=>$v){
- $ replace_con = str_repeat(" n",ceil($v['height']/25));
- $img_pos[$i] = mb_strpos($content, 'img-pos-pos'.$i); //imgタグを削除した後にテキストを使用
- $imgs[$i]['img_pos'] = $img_pos[$i];
- $content = str_replace('img-pos-pos'.$i,$replace_con, $content);
- //$add_footer_input = "nカスタムボトム追加nnn";//カスタムボトム
- $input = str_replace("r", "",stripcslashes($content));
- //$input = str_replace(" " , "" 、stripcslashes($input));
- //$title =explode("nn", $input);
- $ary = imagettfbbox (12, 0, $font, $input);
- $width = abs( $ary[ 2] - $ary[0]) + 40;
- $height = abs($ary[1] - $ary[7]) + 220 + 215 + $p_count*25;
-
- //代わりに高精細画像 imagecreate ()、コンテンツに画像がない場合は、imagecreate を使用することをお勧めします
- $img = @imagecreatetruecolor($width, $height);
- $bg_color=imagecolorallocate($img,229,231,230);
- imagecolortransparent($img,$) bg_color); // 設定 この行をコメントアウトすると上で設定した背景が出力されます
- $bgcolor = imagecolorallocate($img, ' 250', '250', '250') ;
- $bdcolor = imagecolorallocate($img, '250', '250', '250');
- $color = imagecolorallocate($img, '0', '0' , '0');
- $color_title = imagecolorallocate ($img, '250', '140', '0');
- $input = str_replace('endendend','',$input); //追加されたものを削除します。干渉文字
- imagettftext($img, 12, 0 , 20, 160, $color, $font, $input);
- imagettftext($img, 18, 0, 21, 160, $color_title, $font, $title);
- imagerectangle($img, 0, 0, imagex ($img) - 1, imagesy($img) - 1, $bdcolor);
-
- //ここでアイコンの保存パスを設定します
- $img_path = dirname(__FILE__).' /../../weibo_img';
- $ img_path_url = '/wp-content/weibo_img';
-
- //$img_path = empty($img_path)?'':$img_path;
- //$img_path_url = empty( $img_path_url)?'':$img_path_url;
-
- //公開ヘッダー/ボトム画像を合成します
- if(file_exists($img_path.'/weibo_header.jpg') && file_exists($img_path.'/weibo_footer.jpg')){
- $child1 = imagecreatefromjpeg($img_path.'/weibo_header.jpg');
- $child2 = imagecreatefromjpeg($img_path.'/weibo_footer.jpg');
- imagecopymerge ( $img, $child1, 0, 40, 0, 0 、imagesx ( $child1 )、imagesy ( $child1 )、100 );
- imagecopymerge ( $img、$child2、0、$height-215、0、0、imagesx ( $child2 )、imagesy ( $child2 )、100 ) ;
- }
-
- //画像追加(imgタグ)
- if(!empty($imgs)){
- $before_img_height = 0;
- foreach($imgs as $i=>$v){
- $child = $ v[0];
- $part_content = mb_substr( $content,0,$v['img_pos'],'utf-8');
- $rows_count = get_wrap_height(12, 0, $font, $part_content , 300);
- $dst_y = ($rows_count+7)* 27 - 9 + $before_img_height;
- $before_img_height += $v['height'] + 25;//累積占有高さ
- imagecopyresampled($img,$child,18,$ dst_y,0,0,'410',$ v['height'],imagesx($child),imagesy($child));
- }
- }
-
- //画像を生成して画像リンクを返す
- $file = empty ($img_path)?'img/p-' . $pid . '.png':$img_path.'/p-'.$pid.'.png';
- imagepng($img, $file);
- imagedestroy( $img);
- if(empty($img_path_url) ){
- 'http://' . $_SERVER['REQUEST_URI'] . $file;
- }else{
- return 'http://' . $_SERVER['HTTP_HOST'] . $img_path_url . '/p-'.$pid.'.png';
- }
- }
-
- /**
- * HTML をテキストに変換します
- * @param inputString
- * @return
- * /
- function SpHtml2Text($str){
- // $str =strip_tags($str);
- $str = preg_replace("/||/isU","n",$str);
- $alltext = "";
- $start = 1;
- for($i=0;$ i if($start==0 && $str[$i]==">"){
- $start = 1;
- }elseif($start==1 ){
- if($str[$i]= ="<"){
- $start = 0;
- $alltext .= " ";
- }elseif(ord($str[$i])>31) {
- $alltext .= $str[$i] ;
- }
- }
- }
- $alltext = str_replace(" "," ",$alltext);
- $alltext = preg_replace("/&([^;&] *)(;|&)/","" ,$alltext);
- $alltext = preg_replace("/[ ]+/s"," ",$alltext);
- return $alltext;
- }
- /* *
- *
- * 自動行折り返し処理
- * @paramunknown_type $fontsize フォントサイズ
- * @paramunknown_type $angle 角度
- * @paramunknown_type $fontface フォント名 (できれば絶対パスを使用)
- * @paramunknown_type $string string
- * @paramknown_type $widthデフォルト幅
- */
- function autowrap($fontsize , $angle, $fontface, $string, $width) {
- $content = "";
- $letter = array();
- // 文字列を個々の単語に分割しますそしてそれらを配列letter
- for ($ i=0;$i $letter[] = mb_substr($string, $i, 1);
- }
- foreach ( $letter as $l) {
- $teststr = $content." ".$l;
- $testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr);
- // 結合された文字列が次の値を超えているかどうかを判断しますプリセット幅
- if (($testbox[ 2] > $width) && ($content !== "")) {
- $content .= "n";
- }
- $content .= $l;
- }
- $content を返します;
- }
-
- /**
- *
- * 特定のテキストが折り返された後の行数(高さ)を取得します
- * @paramknown_type $fontsize フォントサイズ
- * @paramunknown_type $angle angle
- * @paramunknown_type $fontface フォント名 (を使用するのが最適です)絶対パス)
- * @paramknown_type $string string
- * @paramknown_type $widthDefault width
- */
- function get_wrap_height($fontsize, $angle, $fontface, $string, $width) {
- $content = "";
- $rows_count = 0;
- $letter = array() ;
- // 文字列を個々の単語に分割し、配列 Letter
- for ($i=0;$i $letter[] = mb_substr($string, $ i, 1);
- }
- foreach ($letter as $l) {
- $teststr = $content." ".$l;
- $testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr); // 結合された文字列がプリセット幅を超えているかどうかを判定します
- if (($testbox[2] > $width) && ($content !== "")) {
- $content .= "n"; $ rows_count += 1;
- }else{
- $rows_count += 1/$width;
- }
- $content .= $l;
- }
- return $rows_count;
- }
- /**
- *
- * 置換関数(1回置換)
- * @paramknown_type $needle
- * @paramunknown_type $replace
- * @paramunknown_type $haystack
- */
- 関数 str_replace_once ($needle, $replace, $haystack) {
- $pos = strpos($haystack, $needle);
- if ($pos === false) {
- return $haystack;
- }
- return substr_replace($haystack , $ replace, $pos, strlen($needle));
- }
- ?>
-
-
コードをコピー
|