PHP Maximale bildgröße mit imagecreate?

heyho
ich hab nen kleines problem mit meinem code.

ich brauch tiles von einem sehr großen bild (12k mal 9k pixel)
dafür hab ich nen kleines phpscript geschrieben, was mir das ganze ding zerhackt.
script:

PHP:
<?php

    class prepareImage {

        private $outdir;
        private $image;

        private $tileSize = 100;

        public function __construct() {
            
            error_reporting(E_ALL);
            ini_set("display_errors",true);
            ini_set("memory_limit","2048M");

            $this->outdir = dirname(__FILE__) . "/out";
            $this->checkDirs();
            $this->loadFile();

        }

        private function loadFile() {
            if (!file_exists(dirname(__FILE__) . "/input.png")) die();
            $this->image = imagecreatefrompng(dirname(__FILE__) . "/input.png");

            imagealphablending($this->image, true);
            imagesavealpha($this->image, true);

            $this->size = getimagesize(dirname(__FILE__) . "/input.png");

            $sizes = array(10,15,25,50,75,100);
            for ($i = 0; $i < count($sizes);$i++) {
                echo "\n\nround {$i}\n";
                echo "tiles: ";
                mkdir(dirname(__FILE__) . "/out/size_{$i}");
                $this->resize($sizes[$i]);
                $this->splitImage($i);
                $this->ImageDestroy();
            }
        }

        private function checkDirs() {
            if (!is_writeable($this->outdir)) die("outdir not writeable");
        }

        private function splitImage($i) {
            $y = imagesy($this->imageNew);
            $x = imagesx($this->imageNew);

            $tilesV = bcdiv($x,100)+1;
            $tilesH = bcdiv($y,100)+1;

            for ($y = 1; $y < $tilesH; $y++) {
                for($x = 1; $x < $tilesV;$x++) {
                    echo ".";
                    flush();
                    $tile = imagecreatetruecolor(100, 100);
                    imagecopy($tile, $this->imageNew, 0, 0, ($x*100)-100, ($y*100)-100, 100, 100);
                    imagepng($tile,$this->outdir . "/size_{$i}/{$x}_{$y}.png");
                    imagedestroy($tile);
                }
            }
        }

        public function resize($percentage) {

            $ow = imagesx( $this->image );
            $oh = imagesy( $this->image );



            $mw = floor($ow / 100 * $percentage);
            #$mh = floor($oh / 100 * $percentage);

            if( $ow > $mw || $oh > $mh ) {
                if( $ow > $oh ) {
                    $tnw = $mw;
                    $tnh = $tnw * $oh / $ow;
                } else {
                    $tnh = $mh;
                    $tnw = $tnh * $ow / $oh;
                }
            } else {
                $tnw = $ow;
                $tnh = $oh;
            }

            $this->imageNew = imagecreatetruecolor( $tnw, $tnh );
            imagecopyresampled( $this->imageNew, $this->image, 0, 0, 0, 0, $tnw, $tnh, $ow, $oh );
        }

        public function ImageDestroy() {
            imagedestroy($this->imageNew);
        }
    }
    
    new prepareImage();

?>

das ganze läuft ohne fehler durch, allerdings sind die tiles die rauskommen nicht passend. das input bild ist 12k hoch und 9k breit. die tiles gehen von oben nach unten über das ganze bild, aber nach rechts nur bis ca. 7k pixel.

woran liegt das? hab ich nen fehler drin, den ich seit ewigkeiten nicht sehe oder gibts ein limit von php her? eingesetzt wird hier php5.2.9 cli unter win32

Code:
<?php

    class prepareImage {

        private $outdir;
        private $image;

        private $tileSize = 100;

        public function __construct() {
            
            error_reporting(E_ALL);
            ini_set("display_errors",true);
            ini_set("memory_limit","2048M");

            $this->outdir = dirname(__FILE__) . "/out";
            $this->checkDirs();
            $this->loadFile();

        }

        private function loadFile() {
            if (!file_exists(dirname(__FILE__) . "/input.png")) die();
            $this->image = imagecreatefrompng(dirname(__FILE__) . "/input.png");

            imagealphablending($this->image, true);
            imagesavealpha($this->image, true);

            $this->size = getimagesize(dirname(__FILE__) . "/input.png");

            $sizes = array(10,15,25,50,75,100);
            for ($i = 0; $i < count($sizes);$i++) {
                echo "\n\nround {$i}\n";
                echo "tiles: ";
                mkdir(dirname(__FILE__) . "/out/size_{$i}");
                $this->resize($sizes[$i]);
                $this->splitImage($i);
                $this->ImageDestroy();
            }
        }

        private function checkDirs() {
            if (!is_writeable($this->outdir)) die("outdir not writeable");
        }

        private function splitImage($i) {
            $y = imagesy($this->imageNew);
            $x = imagesx($this->imageNew);

            $tilesV = bcdiv($x,100)+1;
            $tilesH = bcdiv($y,100)+1;

            for ($y = 1; $y < $tilesH; $y++) {
                for($x = 1; $x < $tilesV;$x++) {
                    echo ".";
                    flush();
                    $tile = imagecreatetruecolor(100, 100);
                    imagecopy($tile, $this->imageNew, 0, 0, ($x*100)-100, ($y*100)-100, 100, 100);
                    imagepng($tile,$this->outdir . "/size_{$i}/{$x}_{$y}.png");
                    imagedestroy($tile);
                }
            }
        }

        public function resize($percentage) {

            $ow = imagesx( $this->image );
            $oh = imagesy( $this->image );



            $mw = floor($ow / 100 * $percentage);
            #$mh = floor($oh / 100 * $percentage);

            if( $ow > $mw || $oh > $mh ) {
                if( $ow > $oh ) {
                    $tnw = $mw;
                    $tnh = $tnw * $oh / $ow;
                } else {
                    $tnh = $mh;
                    $tnw = $tnh * $ow / $oh;
                }
            } else {
                $tnw = $ow;
                $tnh = $oh;
            }

            $this->imageNew = imagecreatetruecolor( $tnw, $tnh );
            imagecopyresampled( $this->imageNew, $this->image, 0, 0, 0, 0, $tnw, $tnh, $ow, $oh );
        }

        public function ImageDestroy() {
            imagedestroy($this->imageNew);
        }
    }
    
    new prepareImage();

?>
 
Zuletzt bearbeitet:
setz mal in der PHP.ini den maximal nutzbaren Arbeitsspeicher (memory_limit) hoch...
 
Ist ein bisschen OT, aber zumindest bei mir kann ich beim Z-Series Blue Theme PHP Code kaum lesen, weil Variablen- und Funktionsnamen in einem Blauton gehalten sind, der sich sehr stark mit dem Hintergrundgrauton beißt...
 
Bekommst Du irgend ne PHP Fehlermeldung?

(Mit error_reporting(E_ALL); die Fehlermeldungen-Anzeige aktivieren)


Wie lange dauert die Ausführung dieses Scripts? Eventuell wird die maximale Ausführungszeit überschritten? Mal hochsetzen.



Zu Deinem Code hab ich ein paar Fragen:
PHP:
        private function splitImage($i) {
            $y = imagesy($this->imageNew);
            $x = imagesx($this->imageNew);

            $tilesV = bcdiv($x,100)+1;
            $tilesH = bcdiv($y,100)+1;

            for ($y = 1; $y < $tilesH; $y++) {
                for($x = 1; $x < $tilesV;$x++) {
                    echo ".";
                    flush();
                    $tile = imagecreatetruecolor(100, 100);
                    imagecopy($tile, $this->imageNew, 0, 0, ($x*100)-100, ($y*100)-100, 100, 100);
                    imagepng($tile,$this->outdir . "/size_{$i}/{$x}_{$y}.png");
                    imagedestroy($tile);
                }
            }
        }
1. Wo ist die Funktion bcdiv definiert? Sprich kann es sein, dass diese Funktion die falsche Anzahl an Tiles errechnet? Mal die Zwischenergebnisse gedumpt?

2. Wofür ist der

PHP:
                    echo ".";
                    flush();
Befehl da? Willst Du damit etwas ausgeben, damit der Client die Verbindung nicht abbricht? :rolleyes:
 
also des error_reporting(e_all) habsch ja schon drin wie man obem im code sieht.
das bcdiv is direkt von php selbst, und ist einfach nur eine nicht restbehaftete division, div und mod halt.
die ganze geschichte wird ja über die cli aufgerufen und die ist so configuriert, dass die ausführungszeit kein problem darstellt.
der ausgegebene punkt ist einfach nur nen grober anhaltspunkt für den fortschritt. mehr nicht.

wie wie schon gesagt werden keinerlei fehler ausgespuckt. ich kann ja nochmal die zwischenwerte dumpen, aber die sollten stimmen, da ich ja mit kleineren bildern keine probleme hatte!
 
ich hab jetzt auf nem anderen rechner das unveränderte script nochmal gestartet und mit einer anderen php version ein anderes ergebnis bekommen!
zwar immernoch nicht das vollständige bild, aber deutlich mehr pixel, es fehlen nur noch ca. 200pixel in der breite, höhe ist vollständig.

Code:
C:\Users\easteregg>php -v
PHP 5.3.0 (cli) (built: Jun 29 2009 21:44:56)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

so richtig erklären kann ich mir das verhalten allerdings immernoch nicht.
 
Zurück
Oben