2014-04-11 4 views
0

Я создаю несколько частичных изображений из одного изображения, чтобы использовать для наложения карты. Проблема, с которой я сталкиваюсь, заключается в том, что первое изображение создано успешно, а остальные черные. Я подозреваю, что imagecreatefrompng является виновником, и он не может работать несколько раз, не очищая его, и поэтому мои изображения черные, потому что изображение равно нулю. Пожалуйста, помогите мне найти подходящее решение для моего кода ниже. Заранее спасибо.PHP, создающий несколько изображений из одного изображения с использованием функции imagecreatefrompng в цикле

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

for($x = 0; $x <= $loop; $x++) 
{ 
    //Check for direcotory for X 
    $x_directory = 'generated_images/' . $dbn . '/' . $zoom . '/' . $x; 
    if (!file_exists($x_directory)) 
    { 
     mkdir($x_directory, 0777, true); 
    }//end if 

    //Set Starting Y Copy Values 
    $startY = 0; 
    $endY = 1; 

    for($y = 0; $y <= $loop; $y++) 
    { 
     //Do not need to check for Y images, we will replace any exsisting images 
     //Set a time limit for each Y image 
     set_time_limit(15); 
     $time = time(); 

     $src_image = imagecreatefrompng('generated_images/pre'. $dbn .'.png') or die('Problem with source'); 
     $y_image = imagecreatetruecolor($image_w,$image_h) or die('Problem In Creating image'); 

     if(($x >= 2 && $x <= 5) && ($y >= 5 && $y <= 6)) { 
      ?> 
      <p> 
      Start X: <?=$startX?> <br/> 
      Start Y: <?=$startY?> <br/> 
      End X: <?=$endX?> <br/> 
      End Y: <?=$endY?> <br/> 
      <? 

      //imagecopyresized($y_image, $src_image, 0, 0, $startX, $startY, $image_w, $image_h, 1024, 1024); 

      //Set the blending mode for an image 
      imagealphablending($y_image, false); 
      imagesavealpha($y_image, true); 

      // scan image pixels 
      for ($pix_y = ($startY * $multiplier); $pix_y < ($endY * $multiplier) ; $pix_y++) { 

       for ($pix_x = ($startX *$multiplier); $pix_x < ($endX * $multiplier) ; $pix_x++) { 

        $out_pix = imagecolorat($src_image,$pix_x,$pix_y); 
        $colors = imagecolorsforindex($y_image, $out_pix); 
        //$src_pix_array = rgb_to_array($src_pix); 

        if($colors['red'] == 0 && $colors['green'] == 0 && $colors['blue'] == 0) $alpha = 127; 
        else $alpha = 80; 

        imagesetpixel($y_image, $pix_x, $pix_y, imagecolorallocatealpha($y_image, $colors['red'], $colors['green'], $colors['blue'], $alpha)); 


       }//end for 

      }//end for 

      $startY++; 
      $endY++; 

      imagepng($y_image,$x_directory . '/' . $y . '.png') or die('Problem saving image: ' . $x_directory . '/' . $y . '.png'); 
      imagedestroy($y_image); 
      //imagedestroy($src_image); 

     }//end if 
     else 
     { 
      $black = imagecolorallocate($y_image, 0, 0, 0); 
      // Make the background transparent 
      imagecolortransparent($y_image, $black); 

      imagepng($y_image,$x_directory . '/' . $y . '.png') or die('Problem saving image: ' . $x_directory . '/' . $y . '.png'); 
      imagedestroy($y_image); 

     } 

     $time = time() - $time; 
     ?> 
     Image <?=$x?>,<?=$y?> time: <?=$time?> Seconds <br/> 
     <? 

    } 
    //end for y 

    if(($x >= 2 && $x <= 5)) { 
    $startX++; 
    $endX++; 
    } 

}//end for x 

ответ

1

Если вы пытаетесь разделить большое изображение на более мелкие картинки, я предлагаю вам просто позвонить imagecreatefrompng() один раз, а затем создавать изображения с imagecreatetruecolor() и использовать imagecopyresampled() для каждого из битов копирования в новые объекты изображения (или использовать тот же один и сохранить детали после их извлечения)

Вот как я бы это сделать:

$main_image = imagecreatefrompng($path); //assuming you know the path 
//do your for's and every time your loop runs, you use an $part_image like this 

//LOOP START 
$part_image = imagecreatetruecolor(you know your parameters, atleast you should); 
//do the imagecopyresampled with your coordinates 
imagejpeg($part_image, $part_path); //save the image, make sure each time you do a different filename in order not to overwrite the first part - maybe increment a $counter variable and append it to the filename like "part1.jpg" and so on 
//or imagepng, see php docs for these functions 
imagedestroy($part_image); 
//LOOP END 
+0

вы можете использовать только imagecreatefrompng() один раз? – mcphersonjr

+0

Также вы могли бы привести только короткий пример? – mcphersonjr

+0

Ответьте на короткий пример, если вы умны, вы быстро это выясните. P.S. Daca e mai vb maine, в функциях – ied3vil