使用pgp脚本中的Imagemagick以正确的格式保存图像

时间:2011-01-23 19:56:51

标签: php imagemagick

我尝试在php中保存用imagemagick创建的图像。这是我的代码:

        $source = str_replace(' ','%20',$_GET['src']);
    $uri_components = parse_url($_GET['src']);
    $width = isset($_GET['w']) ? abs(intval($_GET['w'])) : 0;
    $height = isset($_GET['h']) ? abs(intval($_GET['h'])) : 0;
    $zc = isset($_GET['zc']) ? intval($_GET['zc']) : 0;
    $q = isset($_GET['q']) ? intval($_GET['q']) : 0;

    if(isset($uri_components['host']) && !in_array($uri_components['host'], $allowed_domains)) {
        $bad_domain = true;

        if(ALLOW_SUBDOMAINS === true)
            foreach($allowed_domains as $domain)
                if(preg_match('/\.' . str_replace('.', '\.', $domain) . '$/i', $uri_components['host'])) {
                    $bad_domain = false;
                    break;
                }

        if($bad_domain)
            trigger_error('Host not allowed: ' . $uri_components['host'], E_USER_ERROR);
    }

    if(isset($uri_components['host']) || file_exists($source))
        $image_handle = fopen($source, 'rb');
    else if(file_exists($_SERVER['DOCUMENT_ROOT'] . $source))
        $image_handle = fopen($_SERVER['DOCUMENT_ROOT'] .$source, 'rb');
    else
        trigger_error('Image file (src) not found', E_USER_ERROR);

    $image = new Imagick();
    $image->readimagefile($image_handle);

    if($zc)
        try {
            $image->cropthumbnailimage($width, $height);
        } catch (ImagickException $e) {
            trigger_error($e->getMessage(), E_USER_ERROR);
        }
    else
        try {
            $image->thumbnailimage($width, $height, true);  
        } catch(ImagickException $e) {
            trigger_error($e->getMessage(), E_USER_ERROR);
        }


    //$q = 100;
    $image->setImageCompression($compression_type);
    $image->setImageCompressionQuality($q); 
    $image->setResolution(300, 300);


    $cache_time = 157680000;
    header('Cache-Control: max-age=' . $cache_time . ',must-revalidate');
    header('Expires: ' . gmdate("D, d M Y H:i:s", time() + $cache_time));

    header('Content-Type: image/' . $image->getImageFormat());
    echo $image;


    $name = 'cache/'.$filename.'.'.$image->getImageFormat();
    file_put_contents($name, file_get_contents($image));

以这种方式请求图像:

/script.php?src=pic.jpg&w=100&h=100&zc=1&q=90

文件标题似乎有问题。如果我在本地打开一个图像,我收到一个错误,标题是不正确的。我的职能中的错误在哪里?

谢谢, 拉斯

1 个答案:

答案 0 :(得分:3)

实际上在该代码中,您不需要执行file_get_contents($image),因为$image ALREADY是您需要的内容。

我认为最后一行应该是:

file_put_contents($name, $image);