26

I know of imagecreatefromgif(), imagecreatefromjpeg(), and imagecreatefrompng() but is there a way to create an image resource (for png preferably) from a url of any type of valid image? Or do you have to determine the file type and then use the appropriate function?

When I say url I mean something like http://sample.com/image.png, not a data url

Steve Robbins
  • 13,672
  • 12
  • 76
  • 124
  • You need to grab the image first, then work with it then unlink() it. it is possiable (A URL can be used as a filename) but that would still involve fetching it. – Lawrence Cherone Apr 19 '12 at 17:37

7 Answers7

62

The simplest way to do this is let php decide what is the file type:

$image = imagecreatefromstring(file_get_contents($src));
supersan
  • 5,671
  • 3
  • 45
  • 64
33

Maybe you want this:

$jpeg_image = imagecreatefromfile( 'photo.jpeg' );
$gif_image = imagecreatefromfile( 'clipart.gif' );
$png_image = imagecreatefromfile( 'transparent_checkerboard.PnG' );
$another_jpeg = imagecreatefromfile( 'picture.JPG' );
// This requires you to remove or rewrite file_exists check:
$jpeg_image = imagecreatefromfile( 'http://example.net/photo.jpeg' );
// SEE BELOW HO TO DO IT WHEN http:// ARGS IS NEEDED:
$jpeg_image = imagecreatefromfile( 'http://example.net/photo.jpeg?foo=hello&bar=world' );

Here's how it's done:

function imagecreatefromfile( $filename ) {
    if (!file_exists($filename)) {
        throw new InvalidArgumentException('File "'.$filename.'" not found.');
    }
    switch ( strtolower( pathinfo( $filename, PATHINFO_EXTENSION ))) {
        case 'jpeg':
        case 'jpg':
            return imagecreatefromjpeg($filename);
        break;

        case 'png':
            return imagecreatefrompng($filename);
        break;

        case 'gif':
            return imagecreatefromgif($filename);
        break;

        default:
            throw new InvalidArgumentException('File "'.$filename.'" is not valid jpg, png or gif image.');
        break;
    }
}

With some small modifications to switch same function is ready for web url's:

    /* if (!file_exists($filename)) {
        throw new InvalidArgumentException('File "'.$filename.'" not found.');
    } <== This needs addiotional checks if using non local picture */
    switch ( strtolower( array_pop( explode('.', substr($filename, 0, strpos($filename, '?'))))) ) {
        case 'jpeg':

After that you can use it with http://www.tld/image.jpg:

$jpeg_image = imagecreatefromfile( 'http://example.net/photo.jpeg' );
$gif_image = imagecreatefromfile( 'http://www.example.com/art.gif?param=23&another=yes' );

Some proofs:

As you can read from official PHP manual function.imagecreatefromjpeg.php GD allows loading images from URLs that is supported by function.fopen.php, so there is no need to fetch image first and save it to file, and open that file.

6

I use this function. It supports all types of urls and stream wrappers and all image types php can handle.

/**
 * creates a image ressource from file (or url)
 *
 * @version: 1.1 (2014-05-02)
 *
 * $param string:    $filename                    url or local path to image file
 * @param [bool:     $use_include_path]           As of PHP 5 the FILE_USE_INCLUDE_PATH constant can be used to trigger include path search.
 * @param [resource: $context]                    A valid context resource created with stream_context_create(). If you don't need to use a custom context, you can skip this parameter by NULL
 * @param [&array:   $info]                       Array with result info: $info["image"] = imageinformation from getimagesize, $info["http"] = http_response_headers (if array was populated)
 *
 * @see: http://php.net/manual/function.file-get-contents.php
 * @see: http://php.net/manual/function.getimagesize.php
 *
 * @return bool|resource<gd>                       false, wenn aus Dateiinhalt keine gueltige PHP-Bildresource erstellt werden konnte (z.b. bei BMP-Datei)
 * @throws InvalidArgumentException                Wenn Datei kein gueltiges Bild ist, oder nicht gelesen werden kann
 *
 */
function createImageFromFile($filename, $use_include_path = false, $context = null, &$info = null)
{
  // try to detect image informations -> info is false if image was not readable or is no php supported image format (a  check for "is_readable" or fileextension is no longer needed)
  $info = array("image"=>getimagesize($filename));
  $info["image"] = getimagesize($filename);
  if($info["image"] === false) throw new InvalidArgumentException("\"".$filename."\" is not readable or no php supported format");
  else
  {
    // fetches fileconten from url and creates an image ressource by string data
    // if file is not readable or not supportet by imagecreate FALSE will be returnes as $imageRes
    $imageRes = imagecreatefromstring(file_get_contents($filename, $use_include_path, $context));
    // export $http_response_header to have this info outside of this function
    if(isset($http_response_header)) $info["http"] = $http_response_header;
    return $imageRes;
  }
}

Usage (simple example):

$image = createImageFromFile("http://sample.com/image.png");

Usage (complex example):

// even sources with php extensions are supported and e.g. Proxy connections and other context Options
// see http://php.net/manual/function.stream-context-create.php for examples
$options = array("http"=> 
                  array("proxy" => "tcp://myproxy:8080",
                        "request_fulluri" => true
                       )
                  );
$context = stream_context_create($options);

$image = createImageFromFile("http://de3.php.net/images/logo.php", null, $context,$info);

// ... your code to resize or modify the image
Radon8472
  • 4,285
  • 1
  • 33
  • 41
5

This may help you

$image = imagecreatefromstring(file_get_contents('your_image_path_here'));

Example: $image = imagecreatefromstring(file_get_contents('sample.jpg'));

Edwin Thomas
  • 1,186
  • 2
  • 18
  • 31
1

First fetch the url using file_get_contents($url) function and the save the content to a file. After that you can use proper image manipulation functions to further changes. You can use following code to save image from url. Here is the sample code:

$url = "http://sample.com/image.png";
$arr = explode("/",$url);
$img_file = dir(__FILE__).'/'.$arr[count($arr)-1];
$data = file_get_contents($url);
$fp = fopen($img_file,"w");
fwrite($fp,$data);
fclose($fp);

Thanks.

Jeroen de Leeuw
  • 907
  • 1
  • 9
  • 18
Dev
  • 458
  • 1
  • 5
  • 13
0

You might be also interested in most advanced version:

http://salman-w.blogspot.com/2008/10/resize-images-using-phpgd-library.html

<?php
/*
 * PHP function to resize an image maintaining aspect ratio
 * http://salman-w.blogspot.com/2008/10/resize-images-using-phpgd-library.html
 *
 * Creates a resized (e.g. thumbnail, small, medium, large)
 * version of an image file and saves it as another file
 */

define('THUMBNAIL_IMAGE_MAX_WIDTH', 150);
define('THUMBNAIL_IMAGE_MAX_HEIGHT', 150);

function generate_image_thumbnail($source_image_path, $thumbnail_image_path)
{
    list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path);
    switch ($source_image_type) {
        case IMAGETYPE_GIF:
            $source_gd_image = imagecreatefromgif($source_image_path);
            break;
        case IMAGETYPE_JPEG:
            $source_gd_image = imagecreatefromjpeg($source_image_path);
            break;
        case IMAGETYPE_PNG:
            $source_gd_image = imagecreatefrompng($source_image_path);
            break;
    }
    if ($source_gd_image === false) {
        return false;
    }
    $source_aspect_ratio = $source_image_width / $source_image_height;
    $thumbnail_aspect_ratio = THUMBNAIL_IMAGE_MAX_WIDTH / THUMBNAIL_IMAGE_MAX_HEIGHT;
    if ($source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT) {
        $thumbnail_image_width = $source_image_width;
        $thumbnail_image_height = $source_image_height;
    } elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) {
        $thumbnail_image_width = (int) (THUMBNAIL_IMAGE_MAX_HEIGHT * $source_aspect_ratio);
        $thumbnail_image_height = THUMBNAIL_IMAGE_MAX_HEIGHT;
    } else {
        $thumbnail_image_width = THUMBNAIL_IMAGE_MAX_WIDTH;
        $thumbnail_image_height = (int) (THUMBNAIL_IMAGE_MAX_WIDTH / $source_aspect_ratio);
    }
    $thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height);
    imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height);
    imagejpeg($thumbnail_gd_image, $thumbnail_image_path, 90);
    imagedestroy($source_gd_image);
    imagedestroy($thumbnail_gd_image);
    return true;
}
?>
test30
  • 3,496
  • 34
  • 26
-1

you analyse this code.

$url=$_SERVER['REQUEST_URI'];
$url=explode('.',$url);
$extension=$url[1];
switch($extension){
   case'jpg':
      imagecreatefromjpeg();
   break;
}
ILker Özcan
  • 346
  • 4
  • 11
  • There is problem as `$extension` should be last part of array but in your example it is always second part, if `$url = "http://www.example.org/images/picture.png"` then `$extension will be "example"`. Correct way to get last part (your way) is to use `$extension = array_pop(explode('.',$url));`. This keeps `$url` untouched and extracts `$extension` correctly from end of string. – Sampo Sarrala - codidact.org Apr 20 '12 at 16:57