【问题标题】:Create Image From Url Any File Type从任何文件类型的 URL 创建图像
【发布时间】:2012-05-01 07:00:51
【问题描述】:

我知道imagecreatefromgif()imagecreatefromjpeg()imagecreatefrompng(),但是有没有办法从 any 类型的有效图像的 url 创建图像资源(最好是 png)?还是必须先确定文件类型再使用合适的功能?

当我说 url 时,我的意思是 http://sample.com/image.png,而不是数据 url

【问题讨论】:

  • 你需要先抓取图像,然后使用它,然后 unlink() 它。这是可能的(一个 URL 可以用作文件名),但这仍然需要获取它。

标签: php image gd


【解决方案1】:

你分析这段代码。

$url=$_SERVER['REQUEST_URI'];
$url=explode('.',$url);
$extension=$url[1];
switch($extension){
   case'jpg':
      imagecreatefromjpeg();
   break;
}

【讨论】:

  • 存在问题,因为 $extension 应该是数组的最后一部分,但在您的示例中,它始终是第二部分,如果 $url = "http://www.example.org/images/picture.png"$extension will be "example"。获得最后一部分(你的方式)的正确方法是使用$extension = array_pop(explode('.',$url));。这使$url 保持不变,并从字符串末尾正确提取$extension
【解决方案2】:

也许你想要这个:

$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' );

这是如何完成的:

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;
    }
}

switch 进行一些小修改后,相同的功能就可以用于网址:

    /* 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':

之后,您可以将其与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' );

一些证明:

正如您从官方 PHP 手册 function.imagecreatefromjpeg.php 中看到的那样,GD 允许从 function.fopen.php 支持的 URL 加载图像,因此无需先获取图像并将其保存到文件中,并打开该文件。

【讨论】:

  • 你不能依赖扩展是正确的,@supersan 的回答更可靠
【解决方案3】:

首先使用file_get_contents($url) 函数获取url,然后将内容保存到文件中。之后,您可以使用适当的图像处理功能来进一步更改。您可以使用以下代码从 url 保存图像。下面是示例代码:

$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);

谢谢。

【讨论】:

    【解决方案4】:

    您可能还对最高级的版本感兴趣:

    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;
    }
    ?>
    

    【讨论】:

      【解决方案5】:

      我使用这个功能。它支持所有类型的 url 和流包装器以及 php 可以处理的所有图像类型。

      /**
       * 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;
        }
      }
      

      用法(简单示例):

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

      用法(复杂示例):

      // 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
      

      【讨论】:

        【解决方案6】:

        最简单的方法是让 php 决定文件类型:

        $image = imagecreatefromstring(file_get_contents($src));
        

        【讨论】:

        • 简单完美的答案。
        • 谢谢超人!
        【解决方案7】:

        这可能对你有帮助

        $图像= imagecreatefromstring(file_get_contents('your_image_path_here'));

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

        【讨论】:

          猜你喜欢
          • 2019-06-17
          • 2020-06-25
          • 1970-01-01
          • 1970-01-01
          • 2013-09-06
          • 1970-01-01
          • 2016-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多