Hackerboard WikiHaboBlog

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Maximale bildgröße mit imagecreate?

Diskussion: Maximale bildgröße mit imagecreate? im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; heyho ich hab nen kleines problem mit meinem code. ich brauch tiles von einem sehr großen bild (12k mal 9k ...

Antwort
Alt 27.12.09, 18:39   #1 (permalink)
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 60
Standard 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-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->imagetrue);
            
imagesavealpha($this->imagetrue);

            
$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(100100);
                    
imagecopy($tile$this->imageNew00, ($x*100)-100, ($y*100)-100100100);
                    
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->image0000$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

für die die es nicht lesen können   
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();

?>
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>

Geändert von easteregg (28.12.09 um 14:39 Uhr)
easteregg ist offline   Mit Zitat antworten
Alt 27.12.09, 20:34   #2 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 75
Standard

setz mal in der PHP.ini den maximal nutzbaren Arbeitsspeicher (memory_limit) hoch...
beavisbee ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 27.12.09, 21:02   #3 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 60
Standard

der wird ja zur laufzeit korrekt gesetzt und ne fehlermeldung diesbezüglich gibts ja leider auch nicht.
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist offline   Mit Zitat antworten
Alt 28.12.09, 14:34   #4 (permalink)
Senior Member
 
Registriert seit: 13.07.08
enkore Leistung: Pentium Ienkore Leistung: Pentium Ienkore Leistung: Pentium I
Likes: 60
Standard

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...
enkore ist offline   Mit Zitat antworten
Alt 28.12.09, 14:39   #5 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 60
Standard

habs nochmal im code im spoiler gepostet
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist offline   Mit Zitat antworten
Alt 28.12.09, 21:26   #6 (permalink)
404
 
Benutzerbild von 404
 
Registriert seit: 28.11.04
404 Leistung: Z3
404 eine Nachricht über ICQ schicken
Likes: 0
Standard

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-Code:

        
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(100100);
                    
imagecopy($tile$this->imageNew00, ($x*100)-100, ($y*100)-100100100);
                    
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-Code:
                    echo ".";
                    
flush(); 
Befehl da? Willst Du damit etwas ausgeben, damit der Client die Verbindung nicht abbricht?
__________________
Major Fault, General Error and Colonel Panic came together to celebrate timeout.


------------------------------------------------
http://www.shick.de/
------------------------------------------------
404 ist offline   Mit Zitat antworten
Alt 28.12.09, 21:58   #7 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 60
Standard

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!
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist offline   Mit Zitat antworten
Alt 13.01.10, 01:27   #8 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 60
Standard

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.
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » PHP Maximale bildgröße mit imagecreate?
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61