質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

7292閲覧

imagettftextで画像がブラウザに出力されない

daisy

総合スコア30

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2016/12/27 08:40

編集2016/12/27 11:22

###前提・実現したいこと
windows7でxamppをインストールしました。PHPのバージョンはPHP7です。

###発生している問題・エラーメッセージ
imagettftextを使い画像をブラウザに出力しようと思ってマニュアルの例1にある下のプログラムを実行しましたが、**画像ファイルhttp://localhost/hoge.phpは壊れているため、表示できませんでした。**と表示されてマニュアルの出力例のようにならないです。arial.ttfはphpファイルと同じ階層におきました。いったい何が違うのでしょうか?

PHP

1<?php 2// コンテントタイプを設定します 3header('Content-Type: image/png'); 4 5// 画像を生成します 6$im = imagecreatetruecolor(400, 30); 7 8// いくつかの色を生成します 9$white = imagecolorallocate($im, 255, 255, 255); 10$grey = imagecolorallocate($im, 128, 128, 128); 11$black = imagecolorallocate($im, 0, 0, 0); 12imagefilledrectangle($im, 0, 0, 399, 29, $white); 13 14// 描画する文字列 15$text = 'Testing...'; 16// フォント自身のパスでパスを置き換えます 17$font = 'arial.ttf'; 18 19// テキストに影を付けます 20imagettftext($im, 20, 0, 11, 21, $grey, $font, $text); 21 22// テキストを追加します 23imagettftext($im, 20, 0, 10, 20, $black, $font, $text); 24 25// imagepng() を使用して imagejpeg() よりもクリアなテキストにします 26imagepng($im); 27imagedestroy($im); 28?>

###ためしたこと

  • headerの位置をimagepngの直前にする。
  • headerの位置をimagedestroyの直後にする。
  • headerの位置をプログラムの先頭にする。
  • $fontのパスを絶対パス(C:\Windows\Fonts\ARIALNB.TTFC:\xampp\htdocs\arial.ttf)を指定する。
  • $fontをdirname(__FILE__) . 'arial.ttf'もしくは__DIR__ . 'arial.ttf'とする。
  • error_reporting(E_ALL)でエラーが表示されないか確認する。
  • phpinfo()gd_info()でGDライブラリがインストールされているか確認する。

####phpinfo()の結果
phpinfoの結果
####gd_info()の結果

PHP

1Array 2( 3 [GD Version] => bundled (2.1.0 compatible) 4 [FreeType Support] => 1 5 [FreeType Linkage] => with freetype 6 [GIF Read Support] => 1 7 [GIF Create Support] => 1 8 [JPEG Support] => 1 9 [PNG Support] => 1 10 [WBMP Support] => 1 11 [XPM Support] => 1 12 [XBM Support] => 1 13 [WebP Support] => 1 14 [JIS-mapped Japanese Font Support] => 15) 16
  • filesize($font)の実行。

####filesize($font)の実行
以下のようにプログラムを編集して、filesize($font)を表示しました。
$fontのパスはC:\Windows\Fonts\ARIALNB.TTFC:\xampp\htdocs\arial.ttfの両方を試しました。
実行するとどちらのパスを指定した場合も367112という文字が表示されました。

PHP

1<?php 2// コンテントタイプを設定します 3//header('Content-Type: image/png');//headerをコメントアウト 4 5// 画像を生成します 6$im = imagecreatetruecolor(400, 30); 7 8// いくつかの色を生成します 9$white = imagecolorallocate($im, 255, 255, 255); 10$grey = imagecolorallocate($im, 128, 128, 128); 11$black = imagecolorallocate($im, 0, 0, 0); 12imagefilledrectangle($im, 0, 0, 399, 29, $white); 13 14// 描画する文字列 15$text = 'Testing...'; 16// フォント自身のパスでパスを置き換えます 17$font = 'arial.ttf';//`C:\Windows\Fonts\ARIALNB.TTFとC:\xampp\htdocs\arial.ttfで試す。 18 19// テキストに影を付けます 20imagettftext($im, 20, 0, 11, 21, $grey, $font, $text); 21 22// テキストを追加します 23imagettftext($im, 20, 0, 10, 20, $black, $font, $text); 24 25echo filesize($font);//ファイルサイズ表示 26 27// imagepng() を使用して imagejpeg() よりもクリアなテキストにします 28//imagepng($im);//文字化けした文字が一緒に表示されてしまうのでコメントアウト。 29//imagedestroy($im); 30?> 31
  • pngをファイルに保存する。

pngをファイルに保存するときは、以下のプログラムを使いました。
このプログラムを実行すると、phpファイルと同じ階層に120*20pxのtest.pngが作成されました。

PHP

1<?php 2$im = @imagecreatetruecolor(120, 20); 3imagepng($im, "test.png");
s8_chu👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

手元で確認してみましたが、$font = 'arial.ttf';を実在する絶対パスにしたら画像が生成されましたよ

ちなみに環境はubuntu 16.04で以下のフォントを指定しました。

php

1$font = '/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf';

(追記)
切り分けとして、以下のコードを実行するとグレーの画像がでますか

php

1<?php 2// コンテントタイプを設定します 3header('Content-Type: image/png'); 4 5// 画像を生成します 6$im = imagecreatetruecolor(400, 30); 7 8// いくつかの色を生成します 9$white = imagecolorallocate($im, 255, 255, 255); 10$grey = imagecolorallocate($im, 128, 128, 128); 11$black = imagecolorallocate($im, 0, 0, 0); 12imagefilledrectangle($im, 0, 0, 399, 29, $grey); 13 14// 描画する文字列 15$text = 'Testing...'; 16// フォント自身のパスでパスを置き換えます 17$font = '/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf'; 18 19// テキストに影を付けます 20//imagettftext($im, 20, 0, 11, 21, $grey, $font, $text); 21 22// テキストを追加します 23//imagettftext($im, 20, 0, 10, 20, $black, $font, $text); 24 25// imagepng() を使用して imagejpeg() よりもクリアなテキストにします 26imagepng($im); 27imagedestroy($im); 28?>

(追記)
色々調べた結果、原因としてはPHPファイルにBOMが付いているため、画像ファイルにBOMが付いてしまって、画像が壊れていました。
http://dotnsf.blog.jp/archives/1041643802.html

投稿2016/12/27 08:48

編集2016/12/27 12:43
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daisy

2016/12/27 08:57

回答していただきありがとうございます。絶対パス(C:\Windows\Fonts\ARIALNB.TTFとC:\xampp\htdocs\arial.ttf)を指定してみましたが、どちらも画像が表示されず、質問に記述したものと同じエラーメッセージが表示されました。
daisy

2016/12/27 10:15

フォント指定を $font = dirname(__FILE__) . 'arial.ttf'; と $font = __DIR__ . 'arial.ttf'; と修正し実行しましたが、質問文と同様のエラーが表示されました。
popobot

2016/12/27 10:23

font指定の問題ではないのかもしれませんね headerをコメントアウトしてecho filesize($font);とかやるとファイルサイズが表示されますか?
popobot

2016/12/27 10:27

回答欄に切り分け用のimagettftextを使わない画像出力を書いてみたので実行してみてください
daisy

2016/12/27 10:41 編集

質問文に追記したプログラムで$fontのファイルサイズを表示したところ、367112と表示されました。 また、icchiiさんに追記して頂いたプログラムを実行してみたのですが、グレーの画像は出力されず、質問文と同じエラーが表示されました。
popobot

2016/12/27 10:51

もっと初歩的な問題かもしれませんね。 error_reporting(E_ALL);を最初に追記して、エラーとかでませんか? 単にecho "あいうえお";とかやってちゃんと出力されますか? phpinfo();を実行するとGDライブラリがありますか?
daisy

2016/12/27 10:58

ini_set("display_errors", 1); error_reporting(E_ALL); をプログラムの先頭に追記しましたが、エラーは発生しませんでした。 また、 phpinfo(); var_dump(gd_info()); の結果から、GDライブラリはインストールされ使用可能になっています。
popobot

2016/12/27 11:06

では次はブラウザに返すのではなくpngをファイルに保存できるかやってみてください
daisy

2016/12/27 11:20

<?php $im = @imagecreatetruecolor(120, 20); imagepng($im, "test.png"); ?> というプログラムを実行すると、phpファイルと同じ階層に120*20pxのtest.pngが作成されました。
daisy

2016/12/27 12:08

まさしくicchiiさんに紹介して頂いたリンク先の「PHPファイルにBOMが混入していること」が原因でした!! 長く悩んでいたことなので、大変勉強になりました。長い間お付き合いしていただきありがとうございました!ぜひ今後ともよろしくおねがいします。
popobot

2016/12/27 12:41

うまくいってよかったです! もっとエラーメッセージに着目して原因を探っていけば、もう少し早く解決できましたね...こちらこそ勉強になりましたし、色々試して頂いてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問