PHPで画像に線を描画できることは分かりました。≫ PHPで画像に直線や四角、楕円の線を引く方法
このとき線の太さは変えられないのか?
線を太くするのは imagesetthickness() を使います。
だけど円の線を太くするときはうまく出来ませんでした。
その解決方法も php.net に書いてあったので動くサンプルとして紹介します。
PHPで線の太さを指定して画像に描画する方法
PHPで画像に線を引く方法についてはこちらの記事を参考にしてください。
線を太くするには、imagesetthickness()を使います。
第1引数の$画像には描画先の画像をセットします。
第2引数の$太さには太さをint型で指定します。単位はピクセルになります。
処理が成功すれば結果にtrueが返ってきます。
この関数は単体では描画できません。
imagesetthickness()を実行したあとに、線を描画する関数を実行します。
線の描画は、直線のimageline()と四角のimagesetthickness()は問題なく太くなりましたが、円のimageellipse()はなりませんでした。
円については後ほど説明します。
サンプルコード
線を太くした四角を描画するサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 描画先画像ファイル名 $file = "blue.jpg"; // 編集後画像ファイル名 $newfile = "blue_square.jpg"; // 描画先の画像読み込み $image = imagecreatefromjpeg($file); // 線の色(今回は白) $color = imagecolorallocate($image, 255, 255, 255); // 線の太さを設定 imagesetthickness($image, 10); // 四角い線を引く imagerectangle( $image, // 描画する先の画像 100, // 左上角の x 座標 100, // 左上角の y 座標 300, // 右下角の x 座標 200, // 右下角の y 座標 $color); // 線の色 // ファイル名を指定して画像出力 imagejpeg($image, $newfile); |
コードの解説
blue.jpg はベース画像で、描画後は blue_square.jpg に出力します。
imagecreatefromjpeg()でblue.jpgを読み込みます。・・・(1)
imagecolorallocate()で色を指定します。
255, 255, 255 部分はRGBで指定し、今回は白になります。
0~255まで10進数で指定できます。
imagesetthickness()で線の太さを設定します。
対象の画像は(1)の画像になります。
imagerectangle()で線を引きます。
imagejpeg() で描画後の画像をファイル名を指定し、jpeg画像で出力します。
これで線の太さが太くなり次の画像のように出力されます。
線の太さを設定していない画像は次のものになります。
明らかに太くなったことが確認できますね!
楕円の線を引く場合は太くならない
直線や四角い線のとき同様に書いたコード
直線や四角い線のとき同様に線の太さを指定し円を描画する処理を実行してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 描画先画像ファイル名 $file = "blue.jpg"; // 編集後画像ファイル名 $newfile = "blue_circle.jpg"; // 描画先の画像読み込み $image = imagecreatefromjpeg($file); // 線の色(今回は白) $color = imagecolorallocate($image, 255, 255, 255); // 線の太さを設定 imagesetthickness($image, 10); // 楕円の線を引く imageellipse( $image, // 描画する先の画像 300, // 円の中心の x 座標 200, // 円の中心の y 座標 400, // 円の横幅の長さ 200, // 円の縦幅の長さ $color); // 線の色 // ファイル名を指定して画像出力 imagejpeg($image, $newfile); |
これだと線は細いままで太くはなりませんでした。
楕円の線を引く場合は太くならない原因
線を太くするimagesetthickness()について調べてみたところ、以下のような記述がありました。
Apparently imagesetthickness doesn’t work if antialiasing is set to true.(アンチエイリアスがtrueに設定されているとimagesetthicknessは機能しません。)
なにー!!?とはなりませんでした。
アンチエイリアスって何?笑
なんか画像を加工する技術のことみたいです。
線を滑らかにしてくれるんですね。
円の場合は曲線になるから滑らかにする処理が組み込まれていて、そのせいで線を太くする関数imagesetthickness()が機能しないということでしょうか。
うーん。どうしたらいいんやろ・・・と思ったら、上の引用のすぐ下に解決方法も書いてありました(笑)
解決方法を動く形にしてサンプルコードを作成したものが次のコードです。
楕円の線を太くする方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// 描画先画像ファイル名 $file = "blue.jpg"; // 編集後画像ファイル名 $newfile = "blue_circle2.jpg"; // 描画先の画像読み込み $image = imagecreatefromjpeg($file); // 線の色(今回は白) $color = imagecolorallocate($image, 255, 255, 255); // 線の太さ $thickness = 10; $elipse_w = 400; $elipse_h = 200; // 楕円の線を引く for ($line = 0; $line < $thickness; $line++) { $elipse_w--; imageellipse( $image, // 描画する先の画像 300, // 円の中心の x 座標 200, // 円の中心の y 座標 $elipse_w,// 円の横幅の長さ $elipse_h,// 円の縦幅の長さ $color); // 線の色 $elipse_h--; } // ファイル名を指定して画像出力 imagejpeg($image, $newfile); |
1 |
for ($line = 0; $line < $thickness; $line++) { |
デフォルト1pxの線を線の太さ分だけループして描画し、太くしています!
こんなアナログな方法でしか解決できないんだね。
上のコードを実行した結果が次の画像になります。
線が太くなりました!
ちなみに、ループ内の処理の順番が
1 2 3 |
$elipse_w--; imageellipse(略); $elipse_h--; |
となっていますね。
$elipse_wは円の横幅で$elipse_h–;は円の縦幅ですが、横幅は描画前に小さくし、縦幅は描画後に小さくしています。
これなんでだろう??って疑問に思った人も多いかと思います。
理由は分かりません。
ですが、次の順番になるように実験したら画質が落ちました。
1 2 3 |
imageellipse(略); $elipse_w--; $elipse_h--; |
横に並べなくても分かるレベルですね。
理屈は分かりませんが、理由はあったようです。
まとめ
直線や四角、円の線を描画するときに線の太さを太くする方法でした!
線の太さを太くするには、imagesetthickness()を使います。
しかし円の場合はimagesetthickness()では太くすることができません。
円の線を太くする場合は、何本も線を書いて太くするようです。
こんにちは。
以前お会いしたことがあるコミナトと申します。
見ていただきたいプログラムが有りまして連絡した次第です。
友人にお願いしたプログラムが上手く動かず、友人の能力不足なのかわかりませんが時間だけが過ぎていまして困っています。
一度お会いして見ていただき、修正できるものなのか、出来るのであればいくらでやっていただけるものなのか見積もりをしていただけないかと思います。
プログラムについては概要を説明したいので、一度ファミレスかどこかでお会いできればと思います。
もしお会いいただけるのであれば、日時の候補を3つほどお上げいただければと思います。
よろしければ、Gmailまでご返事ください。
mixiでkomicomでマイミク登録されています。
10年ほど前に福井市内のペリカンというお店でmixiのオフ会でお会いしたことがあります。
昨年ユーチューブにコメントさせていただきました。
私自身釣りやアウトドアをやっており何か一緒にできたらとは思っていました。
よろしくおねがいします。
imagesetthickness($im_base, 10);
imagearc($im_base, $init_x_bottom + $r_init_size[‘bottom_diameter’], $init_y_bottom + $r_init_size[‘bottom_diameter’], $r_init_size[‘bottom_diameter’]+20, $r_init_size[‘bottom_diameter’]+20, 0, 360, IMG_COLOR_STYLED);
私の場合はこれでできましたが、どうでしょうか^^
ぶっちゃけ画像の描画についてはめったに使わないので、この分野はあまり得意では無いのが本音です。
PHPも長年使ってきましたが、hiro様の使う関数は初めて見ました。
要件通りに動けば何も問題はないですが、コードの量が減る書き方が出来るのであれば尚良いと思います!
たぶんhiro様のコメント上のコードだけでは動かないと思いますので、コード全体をご教示頂ければ幸いです。
よろしくお願いします。