PHPのGDライブラリだけで角丸する

imagick使ったほうが明らかに綺麗&楽にできるんだけど
勉強がてらGDオンリーでやってみた。

結果

やっぱ綺麗に抜けないw

あとimagickだと3行くらいのソースが無駄に長くなるのがね。
実用的ではないです。

まあ一応GDで画像操作するコツみたいなのはわかったので
無駄ではないかな。。。

一応こんなかんじになりました。

//角の大きさ
$cornerRad = 15;

//元画像の読み込み
$originalImage = imageCreateFromJPEG('images/test.png');
//角画像の読み込み
$cornerPng = ImageCreateFromPNG('rounded_corner.png');

//角をリサンプリングするための画像
$cornerResized = imageCreateTrueColor($cornerRad,$cornerRad);
//リサンプリング用の画像(真っ黒)に角画像をコピーしてついでに大きさを調整する($cornerRad)
imageCopyResampled($cornerResized,$cornerPng,0,0,0,0,$cornerRad,$cornerRad,imageSX($cornerPng),imageSY($cornerPng));
//黒を透明にするため黒を定義
$black = imageColorAllocate($cornerResized,0,0,0);
//リサンプル画像の黒を透明にする
imageColorTransparent($cornerResized,$black);

//元画像のデータ取得
$sizeX = imageSX($originalImage);
$sizeY = imageSY($originalImage);

//元データの左上の角を丸める
imageCopyMerge($originalImage,$cornerResized,0,0,0,0,$cornerRad,$cornerRad,100);

//imageRotateで角丸画像を回転させて、元データの右上の角を丸める
$rotated = imageRotate($cornerResized,90,0);
imageCopyMerge($originalImage,$rotated,0,$sizeY - $cornerRad,0,0,$cornerRad,$cornerRad,100);

//imageRotateで角丸画像を回転させて、元データの左下の角を丸める
$rotated = imageRotate($cornerResized,270,0);
imageCopyMerge($originalImage,$rotated,$sizeX - $cornerRad,0,0,0,$cornerRad,$cornerRad,100);

//imageRotateで角丸画像を回転させて、元データの右下の角を丸める
$rotated = imageRotate($cornerResized,180,0);
imageCopyMerge($originalImage,$rotated,$sizeX - $cornerRad,$sizeY - $cornerRad,0,0,$cornerRad,$cornerRad,100);


//画像出力
header("Content-type: image/jpeg");
imagePNG($originalImage);
imageDestroy($originalImage);
imageDestroy($cornerPng);

左上の画像をPNGで作って
こんなやつ

(背景は黒じゃなくて透明でもOK:どっちにしろ黒バックの画像にリサンプルするから)

それを真っ黒な画像にリサンプルして黒をimageColorTransparentする
でそれを90度ずつ回転させながら角に当ててくってかんじです。

Leave a Reply