Rounded corners using PHP and the GD library

Why GD library?

I needed to add rounded corners to some pictures and didn't want to modify the source files in Photoshop (I think it's a bad idea to modify original pictures if the effect can be added dynamically).

First, I thought CSS would do the trick. But after finding some tutorials on the web (some also use Javascript), I realized that to get it working in most web browsers, it doesn't seem that easy, and it generally means that you have to create a lot of wrapping divs.

That's when I decided to use the GD library, which I had found very useful in other projects. I'm not saying that this solution is perfect or better that others, but it has worked very well for me, and I hope it will be useful to some of you as well. Feel free to contact me if you have any comment about this code.

Sample pictures

Picture with 4 rounded corners, no rotation Picture with 4 rounded corners, rotated Picture with 2 rounded corners, no rotation

PHP code

<?php
$image_file 
$_GET['src'];
$corner_radius = isset($_GET['radius']) ? $_GET['radius'] : 20// The default corner radius is set to 20px
$angle = isset($_GET['angle']) ? $_GET['angle'] : 0// The default angle is set to 0º
$topleft = (isset($_GET['topleft']) and $_GET['topleft'] == "no") ? false true// Top-left rounded corner is shown by default
$bottomleft = (isset($_GET['bottomleft']) and $_GET['bottomleft'] == "no") ? false true// Bottom-left rounded corner is shown by default
$bottomright = (isset($_GET['bottomright']) and $_GET['bottomright'] == "no") ? false true// Bottom-right rounded corner is shown by default
$topright = (isset($_GET['topright']) and $_GET['topright'] == "no") ? false true// Top-right rounded corner is shown by default

$images_dir 'images/';
$corner_source imagecreatefrompng('images/rounded_corner.png');

$corner_width imagesx($corner_source);  
$corner_height imagesy($corner_source);  
$corner_resized ImageCreateTrueColor($corner_radius$corner_radius);
ImageCopyResampled($corner_resized$corner_source0000$corner_radius$corner_radius$corner_width$corner_height);

$corner_width imagesx($corner_resized);  
$corner_height imagesy($corner_resized);  
$image imagecreatetruecolor($corner_width$corner_height);  
$image imagecreatefromjpeg($images_dir $image_file); // replace filename with $_GET['src'] 
$size getimagesize($images_dir $image_file); // replace filename with $_GET['src'] 
$white ImageColorAllocate($image,255,255,255);
$black ImageColorAllocate($image,0,0,0);

// Top-left corner
if ($topleft == true) {
    
$dest_x 0;  
    
$dest_y 0;  
    
imagecolortransparent($corner_resized$black); 
    
imagecopymerge($image$corner_resized$dest_x$dest_y00$corner_width$corner_height100);


// Bottom-left corner
if ($bottomleft == true) {
    
$dest_x 0;  
    
$dest_y $size[1] - $corner_height
    
$rotated imagerotate($corner_resized900);
    
imagecolortransparent($rotated$black); 
    
imagecopymerge($image$rotated$dest_x$dest_y00$corner_width$corner_height100);  
}

// Bottom-right corner
if ($bottomright == true) {
    
$dest_x $size[0] - $corner_width;  
    
$dest_y $size[1] - $corner_height;  
    
$rotated imagerotate($corner_resized1800);
    
imagecolortransparent($rotated$black); 
    
imagecopymerge($image$rotated$dest_x$dest_y00$corner_width$corner_height100);  
}

// Top-right corner
if ($topright == true) {
    
$dest_x $size[0] - $corner_width;  
    
$dest_y 0;  
    
$rotated imagerotate($corner_resized2700);
    
imagecolortransparent($rotated$black); 
    
imagecopymerge($image$rotated$dest_x$dest_y00$corner_width$corner_height100);  
}

// Rotate image
$image imagerotate($image$angle$white);

// Output final image
imagejpeg($image);

imagedestroy($image);  
imagedestroy($corner_source);
?>

How to use it?

Needless to say, PHP and the GD library needs to be installed on your server. You'll also need a png file of the corner. You can use one of our corner images if you want.

Just paste the code above and save it in a php file. Make the necessary changes to the $images_dir and $corner_source variables. Link the src attribute of your image to that file, using the following GET variables:

The 3 pictures above have the following src attributes, respectively:

Enjoy!