12

I was wondering if there's a way to encode an image to a base64 if it was a resource for example if I loaded an image using GD

    $image = imagecreatefromjpeg("captcha/$captcha-$num.jpg");

    // Add some filters
    imagefilter($image, IMG_FILTER_PIXELATE, 1, true);
    imagefilter($image, IMG_FILTER_MEAN_REMOVAL);

If this was my code and instead of saving the image and displaying it using

<img src='someimage.jpg'>

I wanted to display it as a data URI without having to save it, like

<img data='src="data:image/jpeg;base64,BASE64_HERE'>

How can I do that?

Ali
  • 3,479
  • 4
  • 16
  • 31

2 Answers2

37
$image = imagecreatefromjpeg("captcha/$captcha-$num.jpg");

// Add some filters
imagefilter($image, IMG_FILTER_PIXELATE, 1, true);
imagefilter($image, IMG_FILTER_MEAN_REMOVAL);

ob_start(); // Let's start output buffering.
    imagejpeg($image); //This will normally output the image, but because of ob_start(), it won't.
    $contents = ob_get_contents(); //Instead, output above is saved to $contents
ob_end_clean(); //End the output buffer.

$dataUri = "data:image/jpeg;base64," . base64_encode($contents);
TurdPile
  • 976
  • 1
  • 7
  • 21
Bez Hermoso
  • 1,132
  • 13
  • 20
  • Will this work if I have to do this for more than image using a foreach loop? – Ali Mar 08 '14 at 07:29
  • @ChosenWann: Yes. The only "trick" here is the output buffering part. Just make sure that every call of `ob_start()` is paired with an `ob_end_clean()`. – Bez Hermoso Mar 08 '14 at 07:31
  • Thanks for the trick, It's wonderful. Just note that you missed an underscore in "base64_encode" in your example. – Polosson Jul 02 '15 at 22:46
0

I wrote a function for this. It also allows you change the output image format on the fly.

// Example
$im = imagecreate( 100, 100 );
imagecolorallocate( $im, 0, 0, 0 );
echo gdImgToHTML($im);

// Creates an HTML Img Tag with Base64 Image Data
function gdImgToHTML( $gdImg, $format='jpeg' ) {
    ob_start();

    if( $format == 'jpeg'){
        imagejpeg( $gdImg );
    }
    else
    if( $format == 'png' ){
        imagepng( $gdImg );
    }
    else
    if( $format == 'gif' )
    {
        imagegif( $gdImg );
    }

    $image_data = ob_get_contents();
    ob_end_clean();

    return "<img src='data:image/$format;base64," . base64_encode( $image_data ) . "'>";
}
Lachmanski
  • 111
  • 3
  • 5