Сохраните изображение в правильном формате с помощью Imagemagick в сценарии pgp - PullRequest
2 голосов
/ 23 января 2011

Я пытаюсь сохранить изображение, которое было создано с помощью imagemagick в php. Это мой код:

        $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

Кажется, проблема в заголовке файла. если я открываю изображение локально, я получаю ошибку, что заголовок неверен. Где ошибка в моей функции?

Спасибо, Lars

1 Ответ

3 голосов
/ 25 ноября 2011

На самом деле в этом коде вам не нужно делать file_get_contents($image), потому что $image УЖЕ - это контент, который вам нужен.

Я думаю, что последняя строка должна быть:

file_put_contents($name, $image);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...