PHP создает несколько изображений из одного изображения с помощью функции imagecreatefrompng в цикле

Я создаю несколько частичных изображений из одного изображения, чтобы использовать для наложения карты. У меня проблема в том, что первое изображение успешно создано, а остальные черные. Я подозреваю, что 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
Другие вопросы по тегам