PHP / Imagick:只有echo'd才会写入图像

时间:2011-03-18 20:37:38

标签: php imagemagick imagick

以下PHP在传递this image时,将0个字节写入$ cache(但与所有其他已知图像一起正常工作)。如果在调用writeImage之前的echo被取消注释,它可以正常工作。 (由于无关的原因,PHP正在通过<?php exec('php -f thumb.php -- img=zc9vfo.png >output'); ?>运行。)如果有人能给我一些提示,那将是很棒的。     

if(isset($argc) && (!isset($_GET) || empty($_GET))){
  for($i = 1; $i < $argc; ++$i){
    if(strpos($argv[$i], '--') === 0){
      $argv[$i] = substr($argv[$i], 2);
    }
    list($key, $value) = explode('=', $argv[$i], 2);
    $_GET[$key] = $value;
  }
}

if(!isset($_SERVER['DOCUMENT_ROOT']) || $_SERVER['DOCUMENT_ROOT'] == ''){
  $_SERVER['DOCUMENT_ROOT'] = /* ... */;
}

$name =& $_GET['img'];
if(!isset($name)){
  die('unspecified');
}

$pipe_name = realpath("{$_SERVER['DOCUMENT_ROOT']}/lib/php/pipes") . "/$name";
if(!file_exists($pipe_name) && !posix_mkfifo($pipe_name, 0777)){
  file_put_contents('output', 'Pipe could not be created.');
  exit(1);
}
$pipe = fopen($pipe_name, 'r+');
if(!$pipe){
  file_put_contents('output', 'Pipe could not be opened.');
  exit(1);
}

function pipe($msg, $die=FALSE){
  global $pipe;
  fwrite($pipe, $msg . PHP_EOL);
  if($die){
    die($msg);
  }else{
    echo $msg;
  }
}

$w = 150;
$h = 114;

if(!file_exists($image = $_SERVER['DOCUMENT_ROOT'] . '/images/' . $name)){
  pipe('invalid', TRUE);
}
$cache = $_SERVER['DOCUMENT_ROOT'] . '/thumbs/' . $name;
if(!file_exists($cache)){
  $thumb = new Imagick($image);
  $thumb->flattenImages();
  $quotient = min($thumb->getImageWidth() / $w,
                  $thumb->getImageHeight() / $h);
  $thumb->cropImage($w * $quotient, $h * $quotient, 0, 0);
  $thumb->scaleImage($w, $h);
//  echo $thumb->getImageBlob();
  $thumb->writeImage($cache);
}

pipe('success');

fclose($pipe);

?>

2 个答案:

答案 0 :(得分:1)

您可能会误导flattenImages。来自用户注意事项:

  

请注意,该函数返回一个Imagick对象,不会修改现有对象。

您也可能无意中忽略了错误状态。 cropImagescaleImagewriteImage都会在成功时返回布尔值true,前两次会在失败时抛出异常。

当它写一个零字节文件时,getImageBlob是否还返回零字节?我看到你已经对它进行了评论,所以显然你有点嘲笑它。

答案 1 :(得分:-1)

我显然安装了ImageMagick,IMagick和/或libpng。看到这个论坛帖子: http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=18326