我尝试在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
文件标题似乎有问题。如果我在本地打开一个图像,我收到一个错误,标题是不正确的。我的职能中的错误在哪里?
谢谢, 拉斯
答案 0 :(得分:3)
实际上在该代码中,您不需要执行file_get_contents($image)
,因为$image
ALREADY是您需要的内容。
我认为最后一行应该是:
file_put_contents($name, $image);