• 締切済み

PHP GDでテキストを含む最小の画像を作りたい

PHP GDでテキストを描画し、画像の幅・高さがそれを含む最小になるように したいのです。 まずimageftbboxでバウンディングボックスを取得し、そのサイズにすればいいかと思い 以下のコードを書いてみましたが、うまくいきません。 <?php $fontSize = 20; $angle = 0; $fontFile = './msgothic.ttc'; // MSゴシック for ($code = ord('A'); $code <= ord('Z'); $code++) { $text = chr($code); $bbox = imageftbbox($fontSize, $angle, $fontFile, $text); $w = $bbox[2] - $bbox[0]; $h = $bbox[3] - $bbox[7]; var_dump($bbox); echo "w = $w h = $h\n"; $im = imagecreatetruecolor($w, $h); $backcolor = imagecolorallocate($im, 0x00, 0x00, 0x00); $forecolor = imagecolorallocate($im, 0xff, 0xff, 0xff); imagefill($im, 0, 0, $backcolor); $x = 0; $y = -$bbox[7]; echo "x = $x y = $y\n"; imagefttext($im, $fontSize, $angle, $x, $y, $forecolor, $fontFile, $text); imagegif($im, $text .'.gif'); } この場合、Iの右半分が切れてしまいます。 $xを調整すればいいのかと思い、$x = $bbox[0]などとしてみましたが、 どうやっても必ずどれかの文字の一部が切れてしまいました。 これを正しく描画するにはどのようにすればいいでしょうか?

この投稿のマルチメディアは削除されているためご覧いただけません。
  • PHP
  • 回答数2
  • ありがとう数1

みんなの回答

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

imageftbbox で取得されるピクセル位置の原点は、ベースポイント (その文字の左下の角に近い文字のベースライン点) と、マニュアルにありますが、これは等幅で描くときの基準点のようです。特に I は細いので、文字部分の開始点($bbox[0])は、+3などになります。他の太めの文字は、-1なので、4pixelも異なることになります。(20point の場合) 英文字は、はみ出たり細かったり差が激しいので、文字サイズちょっきりにするとかえって不揃いになります。 よって、x位置も、左端の $bbox[0] または、$bbox[6] から算出しないと。 $x = -$bbox[6]; $y = -$bbox[7]; せっかくvar_dump してても、$textも一緒に書き出さないと、どの文字がどんな位置に出力されてるか、数値だけみててもわかりにくいです。

paraspor
質問者

補足

$x = -$bbox[6]; $y = -$bbox[7]; こうすると余計はみ出てしまいました。 なお、質問本文にもあるように、$bbox[6](==$bbox[0])も-$bbox[6]もすでに試しましたがだめでした。

回答No.1

http://php.net/manual/ja/function.imageftbbox.php リファレンスのサンプルコードを使ってもうまくいかないのですか?

paraspor
質問者

補足

「例1 imageftbbox() の例」のことでしょうか? これは300x150の画像の中央に文字列を配置する例で、 私が欲しいのはこの状態から文字列を左上に移動し、さらに画像サイズを 最小(「The PHP Documentation Group」なら188x15くらい)にした状態です。

関連するQ&A

  • PHPのアニュアル17章をみて

    x.phpを <?php Header("Content-type:image/png"); $string=implode($argv," ");//変更場所 $im=imageCreateFromPng("x.png"); $orange=ImageColorAllocate($im,220,210, 60); $px=(imagesx($im)-7.5*strlen($string))/2; ImageString($im,3,$px,9,$string,$orange); ImagePng($im); ImageDestroy($im); ?> としx.htmlを <html><body> <img src="x.php?text"/> </body></html> とし画像x.pngとx.htmlとx.phpを /var/www/html/において 外部のPCからブラウザでx.htmlを呼び出したのですが絵が出ません $string=implode($argv," ");//変更場所 を $string="text"; に変更すれば絵が出ます このままでは引数を引き渡すことができません どうしたらいいのでしょうか?

    • ベストアンサー
    • PHP
  • 文字化け

    phpソースだけなら正しく表示できるのですが、 htmlソースを加えるとphpソースの部分が文字化けし、画像が表示できません。どうしてなのでしょうか? 画像を扱わないプログラムは、文字化けしないのですが、GDで画像を扱うと文字化けしてしまいます。 文字化けする↓ <html><head><title>sample</title></head> <?php $width=$_GET{'wid'}; $height=$_GET{'hei'}; $red=$_GET{'red'};$green=$_GET{'gre'};$blue=$_GET{'blu'}; $text=$_GET{'tex'};$size=$_GET{'siz'}; $red1=$_GET{'red1'};$green1=$_GET{'gre1'};$blue1=$_GET{'blu1'}; $angle=$_GET{'ang'};$x1=$_GET{'x1'};$y1=$_GET{'y1'}; header("Content-type: image/jpeg"); $im = imagecreate($width,$height); $bground = imagecolorallocate($im, $red,$green,$blue); $text_c = imagecolorallocate($im,$red1,$green1,$blue1); imagettftext($im, $size, -$angle,$x1,$y1, $text_c,"Century",$text); imagepng($im); ?> </form></body></html>

    • ベストアンサー
    • PHP
  • 文字を画像として出力したい

    サイト上の情報などを頼りに、下記のようなコードを書きました。 <?php header("Content-Type: image/gif"); $size = 14; $text = "テスト"; $text = mb_convert_encoding($text, "UTF-8", "EUC"); $font = "/home/kymsweb/www/modx/assets/files/fonts/hgrsmp.ttf"; $bbox = ImageTTFBBox($size, 0, $font, $text); $h = $bbox[1] - $bbox[7] + 8; //縦 $w = $bbox[2] - $bbox[0] + 8; //横 $im = ImageCreate($w, $h); ImageColorAllocateAlpha($im, 155, 255, 255, 127); $chars = ImageColorAllocate($im, 155, 0, 255); ImageTTFText($im, $size, 0, 1, $h - 8, $chars, $font, $text); ImageGIF($im); ImageDestroy($im); exit; ?> これをそのままphpファイルとして保存し、サーバ上に転送し アクセスすると「テスト」という文字が画像として表示されます。 ここまでは分かったのですが。 これをさらに応用し、任意のhtmlファイル(正確には拡張子phpのファイルですが)の 中にこのコードを埋め込んで表示したいと考えていますが、当然ながら htmlソースにバイナリを同梱してしまうようなことはできません。 具体的には、CMSのプラグインを自前で作りたいと考えています。 たとえばタイトル画像を任意のフォントを使って画像として リアルタイムに書き出すような使い方です。 このような場合、どのような仕組みを考えるといいのか アドバイスをいただきたいです。

    • 締切済み
    • PHP
  • PHPで、テーブル(表)をimagecreate()で動的に書こうとし

    PHPで、テーブル(表)をimagecreate()で動的に書こうとしています。 PHP初心者です。 imagerectangle(),imagettftext()、fopen()辺りを組み合わせれば良いのだとは思いますが… 各行と列の幅/高さを指定してボーダー(罫線)を引くところまではできて、その後の「各セルに文字を書く」ところでつまずいています。 別ファイルにカンマ区切りで記述しておいた文字列を、fgetcsv()で呼び出せばいいのかなと考えていますが、fgetcsv()の使い方がよくわからず、うまく書けません。 例示をいただければと想います。 現在は、以下のような感じです。 <?php header( "content-type: image/png" ); $image = imagecreate( 228,480 ); //初期化 $bg = imagecolorallocate( $image,0,0,0 ); $border_color = imagecolorallocate( $image,128,0,0 ); $white = imagecolorallocate( $image,255,255,255 ); $font_family = "msgothic.ttc"; //暫定的に。 $wid = 0; //セルの幅 $hgt = 20; //セルの高さ $x = 0; //描画開始位置の横座標。後のfor文の中で値が代入される $y = 0; //描画開始位置の縦座標。後のfor文の中で値が代入される $font_size = 8; $angle = 0; //ここから表の描画 for( $c = 1; $c <= 13; $c++ ) { //cは「何列目か」 if( $c == 1) { $wid = 10; } elseif( $c % 2 == 0 ) { $wid = 5; } else { $wid = 30; } for( $r = 1; $r <= 13; $r++ ) { //rは「何行目か」 $y = $hgt * ($r-1); if( $c == 1) { //1列目ならすべて塗りつぶし imagefilledrectangle( $image, $x , $y , $x + $wid , $hgt , $border_color ); } elseif( $r == 1 && $c % 2 !=0) { //1行目なら奇数列目のセルを塗りつぶし imagefilledrectangle( $image, $x , $y , $x + $wid , $hgt , $border_color ); } else { imagerectangle ( $image, $x , $y , $x + $wid , $hgt , $border_color ); } } $x = $x + $wid; //描画開始位置の変更 } imagepng($image); imagedestroy($image); ?>

    • 締切済み
    • PHP
  • FLASHとPHPの連携について

    プログラミング初心者です。 いまポストカード作成システムを大学の課題で作っています。 環境はWindowsXP FLASH8Proです。 最後の保存するところで詰まっています。 現時点でできているところまでHPにアップしたので載せます。 ​http://www.geocities.co.jp/ysmnh028/otameshi.html​ URLより画像を読み込み最後に保存をしたくていろいろ調べていて、PHPと連携させてブラウザ上に新しいページで画像を生成し、それを右クリック⇒保存という形で保存できる事はわかりました。 SAVEボタンのASは以下のとおりです。 on (press) { // 保存用Bitmapを生成 var bmpSnap = new flash.display.BitmapData(300, 444, false); // 保存したいMovieClipをBitmapに描画する bmpSnap.draw(_root.photo_mc); // BitmapデータをRGB配列にする var img_data = new Array(); for (var x = 0; x<bmpSnap.width; x++) { for (var y = 0; y<bmpSnap.height; y++) { var col = bmpSnap.getPixel(x, y); img_data.push(("000000"+col.toString(16)).substr(-6, 6)); } } // データを送信 System.useCodepage = true; myLoader = new LoadVars(); myLoader.img_width = bmpSnap.width; // 画像幅 myLoader.img_height = bmpSnap.height; // 画像高さ myLoader.img_data = img_data.join(""); // 画像データ myLoader.send("snapshot.php", "_blank", "POST"); } PHP側は <?php // 送信データを取得 $img_data = $_POST['img_data']; $width = $_POST['img_width']; $height = $_POST['img_height']; $type = $_POST['img_type']; // IMAGE生成 $source_img = imagecreatetruecolor ($width, $height); // 背景色を生成 $bg_col = imagecolorallocate($source_img, 0xFF, 0xFF, 0xFF); $border_col = imagecolorallocate($source_img, 0x00, 0x00, 0x00); // イメージを描画 $p = 0; for ($x = 0; $x < $width ; $x++) { for ($y = 0; $y < $height ; $y++) { $rgb = hexdec(substr($img_data, $p, 6)); $p+=6; $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; $col = imagecolorallocate($source_img, $r, $g, $b); imagesetpixel($source_img, $x, $y, $col); } } header("Content-Type: image/jpeg"); imagejpeg($source_img); exit; // JPEG出力 touch("test.jpg"); // まずは空ファイル生成 imagejpeg($source_img, "test.jpg"); // 画像を保存 header("Content-Type: image/jpeg"); readfile('test.jpg'); exit; ?> 以上です。 ローカルでためしたところ画像は表示されず、かわりに代替画像としてアドレスが表示されます。 考えられる原因はなんでしょうか?? よろしくお願いします。

    • 締切済み
    • PHP
  • PHPについて質問です。

    PHPについて質問です。 @@@@@@@@@pic.php@@@@@@@@@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>画像作成⇒保存</title> </head> <body> <?php //0から32767までの間で乱数を発生させる //乱数の最小値と最大値を定義 $number_min = 0; $number_max = 32767; //乱数ジェネレータを初期化 srand((double)microtime()*100000); //乱数を発生させる $number_value = rand($number_min, $number_max); // 空の画像を作成し、テキストを追加します $im = imagecreatetruecolor(120, 20); $text_color = imagecolorallocate($im, 233, 14, 91); imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color); // 画像を 'simpletext.jpg' として保存します imagejpeg($im, $number_value.'simpletext.jpg'); // メモリを開放します imagedestroy($im); ?> </body> </html> @@@@@@@@@@@@@@@@@@@@@@@@@@@ 上記のPHPを、・・・ テキストボックスに入力したりして文字列を取得したり、画像の大きさをリストメニューを設定して、作成ボタンを押すと、上記のPHPと同じように出力できるようにするにはどうすればいいですか?

    • ベストアンサー
    • PHP
  • 円グラフ

    PHPで円グラフを作成しています。 以下のサンプルをサイトで入手し動作を確認しました。このままでは色分けのみで何のデータか解りにくいので、データに何のデータであるかの文章を挿入したいのですが方法が解りません。解る方よろしくお願いします。 <?php header("Content-Type: image/png"); ?> <?php // 画像のサイズ $im = imagecreate(200,200); // キャンパスの大きさ $ix = 100; // 中心のx座標 $iy = 100; // 中心のy座標 $iw = 200; // 画像の横幅 $ih = 200; // 画像の縦幅 $rs = 270; // 開始角度(上:270) // データ $data[0] = 80; $data[1] = 50; $data[2] = 30; $data[3] = 20; $data[4] = 10; // 色の定義(データの数だけ必要) $white = imagecolorallocate($im,255,255,255); $red = imagecolorallocate($im,255,0,0); $yellow = imagecolorallocate($im,255,255,0); $lime = imagecolorallocate($im,0,255,0); $cyan = imagecolorallocate($im,0,255,255); $blue = imagecolorallocate($im,0,0,255); $cd = array($red,$yellow,$lime,$cyan,$blue); // 合計値の計算 $length = count($data); $m=0; for($i=0; $i<=$length; $i++) { $m += $data[$i]; } // 画像の描画 for($i=0; $i<$length; $i++) { $st = $rs; $rs += $data[$i] / $m * 360; if($rs >= 360) $rs -= 360; imagefilledarc($im,$ix,$iy,$iw,$ih,$st,$rs,$cd[$i],4); } imagepng($im); ?>

    • 締切済み
    • PHP
  • 拡張子が.pisのファイルを編集できるようにしたい

    ファイルの拡張子に.pisとついているファイルは何でしょうか? その内容を操作できるようにしたいです。 ワードパットで開くことができました。 その中身の一例です。   : </Text> <TmbList>     <x>132</x>     <y>378</y>     <w>645</w>     <h>101</h>     <bgcolor   : htmlやcssなどの教材はネットに山ほどありますが この.pisは見つかりません。 ネット上に何かいい教材はありますか?

  • JButtonの画像をactionPerformedメソッド内で再描画

    JButtonの画像をactionPerformedメソッド内で再描画したい。 以下のソースのようにして、再描画したいのです。 setIconメソッドではなく、 JButtonに対して描画したものに対して再描画したいです。 Graphics2DクラスについてJAVA APIで調べましたが、 仕組の理解に至りませんでした。 仕組みと方法を教えて頂きたいです。 よろしくお願いいたします。 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; public class test extends JFrame implements ActionListener{ JButton b= new JButton(); public static void main(String a[]) { new test(); } public test() { super(); this.setSize(100,100); b.addActionListener(this); b.add(new Zoom(new ImageIcon("img1.jpg"),0,0,50,50)); this.add(b); this.setVisible(true); } class Zoom extends JComponent { private static final long serialVersionUID = 1L; private ImageIcon icon = null; private int x = 0; private int y = 0; private int h = 0; private int w = 0; private double scale = 1.0d; public Zoom(ImageIcon icon, int x, int y, int w, int h) { super(); this.icon = icon; this.x = x; this.y = y; this.w = w; this.h = h; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.scale(scale, scale); ////////////////////////////////// //画僧を再描画したい。 //g2.clearRect(0, 0, 80, 80);//× g2.drawImage(icon.getImage(), x, y, w, h, this); } } public void actionPerformed(ActionEvent e) { if(e.getSource()==b){ System.out.print("ok"); //this.repaint();//× //b.repaint();//× b.add(new Zoom(new ImageIcon("img2.jpg"),0,0,50,50));//(再描画できない) //b.setIcon(new ImageIcon("img2.jpg"));//ok(再描画出来る) } } }

    • ベストアンサー
    • Java
  • 【C#】ラベルのダブルクリックについて

    初めて質問させていただきます。C#初心者です。よろしくお願いします。 開発環境はMicrosoft Visual C# 2008です。 現在、UserControl1を作成して、label1にはテキストを入れています。 ・label1をクリックすると、パネル(panel1)の背景色を変更。 ・label1をダブルクリックすると、他のラベル(atai_text)にlabel1内のテキストを代入。 ↑上記2つの処理をしたいのですが、クリックの方は処理できているのですが、ダブルクリックは反応せず、どのように作成すればよいかがわかりません。 <UserControl1.csの一部> private void label1_Click(object sender, EventArgs e) { if (this.label1.BackColor == Color.Pink) { this.panel1.BackColor = Color.FromArgb(0xFF, 0xFF, 0x80); } else { this.panel1.BackColor = Color.Pink; } } private void label1_DoubleClick(object sender, EventArgs e) { this.atai_text.Text = this.label1.Text; } どなたかご教授よろしくお願いします。

専門家に質問してみよう