PHP / Imagick: изображение пишется только если echo'd - PullRequest
0 голосов
/ 18 марта 2011

Следующий PHP, когда передается это изображение , записывает 0 байтов в $ cache (но отлично работает со всеми другими известными изображениями). Если эхо непосредственно перед вызовом writeImage не закомментировано, оно работает нормально. (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 ]

1 голос
/ 19 марта 2011

Возможно, вы неправильно используете flattenImages. Из заметок пользователя:

Обратите внимание, что функция возвращает объект Imagick и не изменяет существующий объект.

Вы также можете случайно игнорировать состояния ошибок. cropImage, scaleImage и writeImage все возвращают логическое значение true при успехе и первые два исключения исключения при сбое.

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

0 голосов
/ 21 марта 2011

У меня, видимо, неправильная установка ImageMagick, IMagick и / или libpng.Смотрите эту ветку форума: http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=18326

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