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度ずつ回転させながら角に当ててくってかんじです。