2011-01-25 7 views
1

私はいくつかの画像をキャンバスにコピーしてファイルに保存する機能を持っています。私のコードは投稿の一番下にあります。PHPのキャンバスにたくさんの画像をコピーするにはどうしたらいいですか?

コードは、キャンバスに15枚の画像をコピーしようとするとうまく動作しますが、コピーしようとするとちょうど停止します。エラーまたは例外はありません...

私はあなたの1が:)

$img  = imagecreatefromjpeg($image); 
    $imgWidth = imagesx($img); 
    $imgHeight = imagesy($img); 

    // CREATE CANVAS AND FILL WITH WHITE 
    $canvas  = imagecreatetruecolor($guidelines['canvasW'] * $dpi, $guidelines['canvasH'] * $dpi); 
    $color  = imagecolorallocate($canvas, 255, 255, 255); 
    imagefill($canvas, 0, 0, $color); 

    // COPY THE IMAGES ONTO THE CANVAS 
    foreach($guidelines['imageGuide'] as $guide): 

     $bestFit = bestFit($imgWidth, $imgHeight, $guide['W'] * $dpi, $guide['H'] * $dpi); 
     if($bestFit['rotate']) { 
      $output = imagerotate($img, 90, 0); 
     } else { 
      $output = imagerotate($img, 0, 0); 
     } 
     imagecopyresampled($canvas, $output, $guide['X'] * $dpi, $guide['Y'] * $dpi, 0, 0, $bestFit['x'], $bestFit['y'], imagesx($output), imagesy($output)); 

     imagedestroy($output); 
    endforeach; 

$ガイドライン私を助けることを願って配列です。ここで私はあなたがこの仕事にあまりにも多くのRAMを使用していることを推測するつもりだキャンバス

$guidelines = array( 'canvasW' => 20, 
      'canvasH' => 30, 
      'imageGuide' => array(
         array('W' => 18, 'H' => 13, 'X' => 1, 'Y' => 1.5), 

         array('W' => 3.5, 'H' => 4.5, 'X' => 1.25, 'Y' => 15), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 4.75, 'Y' => 15), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 8.25, 'Y' => 15), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 11.75, 'Y' => 15), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 15.25, 'Y' => 15), 

         array('W' => 3.5, 'H' => 4.5, 'X' => 1.25, 'Y' => 19.5), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 4.75, 'Y' => 19.5), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 8.25, 'Y' => 19.5), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 11.75, 'Y' => 19.5), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 15.25, 'Y' => 19.5), 

         array('W' => 3.5, 'H' => 4.5, 'X' => 1.25, 'Y' => 24), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 4.75, 'Y' => 24), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 8.25, 'Y' => 24), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 11.75, 'Y' => 24), 
         array('W' => 3.5, 'H' => 4.5, 'X' => 15.25, 'Y' => 24), 
        ), 
       ); 
+0

エラーレポートはありますか? ... –

+0

あなたのエラーログをチェックして、あなたのアプリケーションの中に 'error_reporting(0)'を入れてみてください、どこかにトレースがあるはずです – RobertPitt

+0

$ dpiはどこにでも定義されていますか?サンプルで使用しますが、設定しないでください。 –

答えて

0

に16枚の画像をコピーする例があります。 ImageCopyResampledは、あなたが持っているこの仕事ではRAMに多くの情報を書き込まなければならず、イメージには多くのメモリが必要です。あなたのphp.iniファイルのmemory_limitをチェックしてください。イメージを増やして、キャンバスに書き込まれている画像の多くまたはすべてを取得できるかどうか確認してください。がんばろう!

+0

なぜそれはあまりにも多くのRAMを要するか分かりません。私は、forloopの最後に、imagedestroy($ output) $ IMGと$ canvasだけをメモリに残していますか?メモリ制限を増やそうとしていて、テストを今実行しています:うまくいきたいですね:) –

+0

本当に、あなたは 'imagedestroy()'を実行しています。それは助けますが、その可能性はキャンバス自体が多すぎます。キャンバスに新しいイメージを書くたびに古いバージョンのキャンバスはRAMに残っているので、15回の反復の後では、ラムにキャンバスが15個コピーされている反復ごとに大きくなります)。 –

+0

私はそれについても考えましたが、私は答えを見つけることができませんでした:(しかし、私は今働いています。私はメモリの制限を増やし、それを引き起こしたと思います。私はset_time_limit(300)を使用しようとしました;私のforeachループでは、200秒後に(php.iniで設定されている)タイムアウトしていますが、私はsafemodeにはありません。 –

関連する問題