PHP ImageCreateFromString和file_get_contents

时间:2010-01-07 02:24:19

标签: php image-processing

我正在尝试在PHP中创建一个函数,它允许我输入基本上任何URL,然后在其上运行一些函数,就像用户在我的服务器上上传一样。所以我会调整大小并制作一些缩略图,但我需要帮助才能使图像处于可以在其上运行其他代码的状态。此站点上的另一位用户帮助我开始使用ImageCreateFromString()和file_get_contents()

请注意这段代码缺少很多我知道的东西,我只是想让基本功能正常工作,然后我会添加所有安全措施

我使用这样的网址尝试了以下代码,并在我的脚本网址中添加了照片网址:

http://example.com/friendproject2/testing/photos/fromurl/?url=http://a0.twimg.com/a/1262802780/images/twitter_logo_header.png

但它没有显示任何内容,甚至没有出现错误     

function getphotoURL($url){
    if(isset($url) && $url != 'bad') {
        $image = ImageCreateFromString(file_get_contents($url));
        if (is_resource($image) === true){
            echo 'The URL of the image we fetch is :' .$url. '<BR><BR>';
            //show image
            header('Content-Type: image/jpeg');
            imagejpeg($image, null, 100);
            imagedestroy($image); 
            imagedestroy($image); 
            // image is valid, do your magic here
        }else{
            // not a valid image, show error
            echo 'error getting URL photo from ' .$url;
        }
    }else{
        //url was empty
        echo 'The URL was not passed into our function';
    }
}
?>

######更新#####

这似乎是我的一个简单错误,简单的检查POST请求而不是GET请求,下面是我的新代码。

我有几个问题,

1)我使用的是imagejpeg($ image,null,100);我想知道,我应该使用其他东西吗?它是否需要源图像是jpg或它是否适用于任何图像?我需要允许主要类型(jpg,jpeg,gif,png)

2)与上述问题相同,但是当在屏幕上显示图像时,我将标题设置为:header('Content-Type:image / jpeg');它不应该是其他类型图像的jpg吗?

3)有没有办法可以确保传入的源网址是实际图片,如果不是图片就做我想做的事情,比如显示我自己的错误或做一旦检测到URL不是有效的图像URL

,我自己的代码
<?PHP
// run our function
if(isset($_GET['url']) && $_GET['url'] != "") {
    getphotoURL($_GET['url'],'no');
}


function getphotoURL($url, $saveimage = 'yes'){
    if(isset($url) && $url != '') {
        $image = imagecreatefromstring(file_get_contents($url));
        if (is_resource($image) === true){
            if($saveimage === 'yes'){
                // resize image and make the thumbs code would go here if we are saving image:
                // resize source image if it is wider then 800 pixels
                // make 1 thumbnail that is 150 pixels wide
            }else{
                // We are not saving the image show it in the user's browser
                header('Content-Type: image/png');
                imagejpeg($image, null, 100);
                imagedestroy($image); 
            }
        }else{
            // not a valid resource, show error
            echo 'error getting URL photo from ' .$url;
        }
    }else{
        // url of image was empty
        echo 'The URL was not passed into our function';
    }
}
?>

2 个答案:

答案 0 :(得分:4)

为PNG或GIF(透明度)调用imagecreatefromstring()后

对图像进行以下操作:

imagealphablending($image, true); // setting alpha blending on
imagesavealpha($image, true);

将平坦的黑色背景变为Alpha通道。

答案 1 :(得分:0)

回答您的新问题:

  

1)我正在使用imagejpeg($ image,null,   100);我想知道,我应该   用别的东西?它需要吗?   源图像是jpg或将   它适用于任何图像?我需要   允许主要类型(jpg,jpeg,gif,   PNG)

嗯,php.net说,“imagejpeg()从给定的图像创建一个JPEG文件”。但重要的是这个,“一个图像资源,由图像创建函数之一返回,如imagecreatetruecolor()。”。并且您使用“imagecreatefromstring()返回一个图像标识符,表示从给定数据中获取的图像。如果您的PHP版本支持它们,将自动检测这些类型:JPEG,PNG,GIF,WBMP和GD2。” 所以,那应该没问题。

  

2)与上述问题相同但是何时   我在屏幕上显示图像   标头设置为:   标题('Content-Type:image / jpeg');   如果不是其他类型的jpg   图象?

标题应为jpg类型 - 如果这是文件类型,那么你是正确的。

  

3)有没有办法让我确定   传入的源URL是一个   实际的形象,做任何我想做的事情   它不是一个图像,就像展示我自己的一样   一旦检测到错误或执行我自己的代码   该URL不是有效的图片网址

是的 - 而不是做:

$image = ImageCreateFromString(file_get_contents($url));

你可以这样做:

$image = imagecreatefromjpeg($url);
if (!$image) echo "error"; 
  

imagecreatefromjpeg()返回一个图像   表示图像的标识符   从给定的文件名中获取。

但实际上,你所拥有的一切都很好。


是否显示错误消息

    echo 'The URL was not passed into our function';

或者什么都没有?

如果显示错误消息,可能检查===失败:

  

将返回图像资源   成功。如果是,则返回FALSE   图像类型不受支持,数据是   不是公认的格式,或者   图像已损坏且无法加载。

此外,您是否在开发服务器上记录了最大错误?这样你可以看到任何可能的警告被抛出?