O'Reilly

Image Manipulation with PHP and the GD Library

By on  
David Walsh Sepia

Yeah, I'm a Photoshop wizard. I rock the selection tool. I crop like a farmer. I dominate the bucket tool. Hell, I even went as far as wielding the wizard wand selection tool once.

...OK I'm rubbish when it comes to Photoshop. I avoid opening the memory pig whenever possible. Many times I even need to automate image manipulation on customer websites. Luckily for a nerd like me, PHP's GD library allows me to systematically execute basic image manipulations without the need for Photoshop, GIMP, or other desktop tools.

The PHP -- Color to Greyscale

//to black and white
if(!file_exists('dw-bw.png')) {
	$img = imagecreatefrompng('dw-manipulate-me.png');
	imagefilter($img,IMG_FILTER_GRAYSCALE);
	imagepng($img,'db-bw.png');
	imagedestroy($img);
}

The PHP -- Color to Negative

//to negative
if(!file_exists('dw-negative.png')) {
	$img = imagecreatefrompng('dw-manipulate-me.png');
	imagefilter($img,IMG_FILTER_NEGATE);
	imagepng($img,'db-negative.png');
	imagedestroy($img);
}

The PHP -- Color to Sepia

//to black and white, then sepia
if(!file_exists('dw-sepia.png')) {
	$img = imagecreatefrompng('dw-manipulate-me.png');
	imagefilter($img,IMG_FILTER_GRAYSCALE);
	imagefilter($img,IMG_FILTER_COLORIZE,100,50,0);
	imagepng($img,'db-sepia.png');
	imagedestroy($img);
}

As you can see, PHP's GD library is a very competent, useful library. Though image libraries like ImageMagick get more credit than GD, GD is more than enough for the majority of designers and developers. Be sure to check out PHP image filters -- you can emboss images, fade images, and much more!

Track.js Error Reporting

Upcoming Events

Recent Features

  • Facebook Open Graph META Tags

    It's no secret that Facebook has become a major traffic driver for all types of websites.  Nowadays even large corporations steer consumers toward their Facebook pages instead of the corporate websites directly.  And of course there are Facebook "Like" and "Recommend" widgets on every website.  One...

  • How I Stopped WordPress Comment Spam

    I love almost every part of being a tech blogger:  learning, preaching, bantering, researching.  The one part about blogging that I absolutely loathe:  dealing with SPAM comments.  For the past two years, my blog has registered 8,000+ SPAM comments per day.  PER DAY.  Bloating my database...

Incredible Demos

  • Introducing LazyLoad 2.0

    While improvements in browsers means more cool APIs for us to play with, it also means we need to maintain existing code.  With Firefox 4's release came news that my MooTools LazyLoad plugin was not intercepting image loading -- the images were loading regardless of...

  • Vibration API

    Many of the new APIs provided to us by browser vendors are more targeted toward the mobile user than the desktop user.  One of those simple APIs the Vibration API.  The Vibration API allows developers to direct the device, using JavaScript, to vibrate in...

Discussion

  1. M

    PHP + GD is powerful stuff indeed! Big ups for your blog, David, love your posts, especially the mootools-related stuff. Has helped me a lot.

  2. What a coincidence I also crop like a farmer ;)

  3. On a more serious note… the only issue I have with GD is that it can’t resize or handle animated gifs correctly…that’s a really big disadvantage… if you can teach me to resize an animated gif with php, I’ll sure bow down low ;)

  4. Hey, your Sepia-Logo looks really nice!
    You could use it in the case you make a redesign ;)

  5. Case for IMagick/et al:
    – same function to opens all image formats
    – memory management (helpful for very large images)

    //to black and white, then sepia
    if(!file_exists('dw-sepia.png')) {
        $img = Imagick('dw-manipulate-me.png');
        $img->setImageColorspace(GRAYColorspace);
        $img->sepiaToneImage(80);
        $img->writeImage('db-sepia.png');
        $img->destroy();
    }
    
  6. Hey David,

    Great stuff, I’m a huge fan of using the GD library to help achieve certain effects with images. I hope you don’t think I’m link whoring, but I wrote a 2 part article for ThemeForest on exactly this topic and thought you might find it interesting:

    http://blog.themeforest.net/tutorials/fun-with-the-php-gd-library-part-2/

    Keep up the great work!

    -Drew

  7. I’ve been wondering, but not enough to investigate, how to make images with rounded corners, like facebook — any idea how?

  8. I’ve used GD in the beginning, but as you go along with larger images, or other file formats, it’s better to leave GD alone and use ImageMagick. GD can also be a memory pig and the use for it is limited.
    With IMagick (in response to EmEhRKay) you can use masks to cut out your images (to make rounded corners). You can rotate, flip, flop, convert, resize, etc. within the blink of an eye. You can even create thumbnails of 500MB Illustrator documents if you want (not that that’s recommended) :-)

  9. Awesome Drew!

  10. Nice fast way to deal with simple changes to images. Thanks.

  11. Do you know how to create “Virtual Product Samples” with any PHP script? are you aware of any such script which helps in creating 3D samples of various images and finally combined as one virtual sample.

  12. this looks great but you should check out my site, there so much easier way to achieve the same!

  13. Hi,

    Nice codes here, but i want to block the adult images from my site http://www.neatstat.com and only want to display the good, clean images. How do I block these adult images?

    Do you have any image filter to do that like bad words filter?

    Any help will be much appreciated.

    Thanks
    Pummy

  14. Thanks! I was looking for a way to convert a captured image to sepia using the GD library, and you had the perfect answer for me.

  15. Post seems like too old to ask a question. But how can I use it for jpg files.
    I tried this

    if(!file_exists('source.jpg')) {
    $img = imagecreatefromjpeg('source.jpg');
    imagefilter($img,IMG_FILTER_GRAYSCALE);
    imagefilter($img,IMG_FILTER_COLORIZE,100,50,0);
    imagejpeg($img,'output.jpg');
    imagedestroy($img);
    }

    its not working.
    I want to use this for jpg images, should I convert png files before using

    imagefilter($img,IMG_FILTER_GRAYSCALE);

    ?

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!

Recently on David Walsh Blog

  • OâReilly Velocity Conference â New York

    My favorite front-end conference has always been O'Reilly's Velocity Conference because the conference series has focused on one of the most undervalued parts of client side coding:  speed.  So often we're so excited that our JavaScript works that we forget that speed, efficiency, and performance are just as important. The next Velocity...

  • Free Download: Font Bundle Featuring 17 Incredible Typefaces

    The only thing we love more than a good font, is a good free font. So we’ve combed the Web for some of our favorite free fonts, and gathered them here in a single download. You’ll find a variety of useful typefaces, from highly geometric designs...

  • OâReilly Velocity Conference â Amsterdam

    My favorite front-end conference has always been O'Reilly's Velocity Conference because the conference series has focused on one of the most undervalued parts of client side coding:  speed.  So often we're so excited that our JavaScript works that we forget that speed, efficiency, and performance are just as important. The next Velocity...

  • CanIUse Command Line

    Every front-end developer should be well acquainted with CanIUse, the website that lets you view browser support for browser features.  When people criticize my blog posts for not detailing browser support for features within the post, I tell them to check CanIUse:  always up to date, unlike...

  • Generating Alternative Stylesheets for Browsers Without @media

    If your CSS code is built with a mobile-first approach, it probably contains all the rules that make up the "desktop" view inside @media statements. That's great, but browsers that don't support media queries (IE 8 and below) will simply ignore them, ending up getting the...