Creating an image without storing it as a local file Creating an image without storing it as a local file php php

Creating an image without storing it as a local file


Most people using PHP choose either ImageMagick or Gd2

I've never used Imagemagick; the Gd2 method:

<?php// assuming your uploaded file was 'userFileName'if ( ! is_uploaded_file(validateFilePath($_FILES[$userFileName]['tmp_name'])) ) {    trigger_error('not an uploaded file', E_USER_ERROR);}$srcImage = imagecreatefromjpeg( $_FILES[$userFileName]['tmp_name'] );// Resize your image (copy from srcImage to dstImage)imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, RESIZED_IMAGE_WIDTH, RESIZED_IMAGE_HEIGHT, imagesx($srcImage), imagesy($srcImage));// Storing your resized image in a variableob_start(); // start a new output buffer  imagejpeg( $dstImage, NULL, JPEG_QUALITY);  $resizedJpegData = ob_get_contents();ob_end_clean(); // stop this output buffer// free up unused memmory (if images are expected to be large)unset($srcImage);unset($dstImage);// your resized jpeg data is now in $resizedJpegData// Use your Undesigned method calls to store the data.// (Many people want to send it as a Hex stream to the DB:)$dbHandle->storeResizedImage( $resizedJpegData );?>

Hope this helps.


This can be done using the GD library and output buffering. I don't know how efficient this is compared with other methods, but it doesn't require explicit creation of files.

//$image contains the GD image resource you want to storeob_start();imagejpeg($image);$jpeg_file_contents = ob_get_contents();ob_end_clean();//now send $jpeg_file_contents to S3


Once you've got the JPEG in memory (using ImageMagick, GD, or your graphic library of choice), you'll need to upload the object from memory to S3.

Many PHP S3 classes seem to only support file uploads, but the one at Undesigned seems to do what we're after here -

// Manipulate image - assume ImageMagick, so $im is image object$im = new Imagick();// Get image source data$im->readimageblob($image_source);// Upload an object from a resource (requires size):$s3->putObject($s3->inputResource($im->getimageblob(), $im->getSize()),                   $bucketName, $uploadName, S3::ACL_PUBLIC_READ);

If you're using GD instead, you can useimagecreatefromstring to read an image in from a stream, but I'm not sure whether you can get the size of the resulting object, as required by s3->inputResource above - getimagesize returns the height, width, etc, but not the size of the image resource.