Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] FATAL: emalloc(): Unable to allocate 14040 bytes

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] FATAL: emalloc(): Unable to allocate 14040 bytes

    Nabend / Morgen!

    Ich weis nicht mehr weiter. Es geht um ein Script das knapp 14 KB groesse Bildfragmente von ueber ein anderes Script abruft und mit imageCopyMerge() zusammenpackt.

    Nach dem 28sten Fragment und knappen 15 sec verabschiedet sich der Mozilla mit "Das Dokument enthaelt keine Daten.". In den Appache Errorlogs finde ich dann besagte Fehlermeldung vor.

    Maschine: Apache/1.3.29 (Win32) PHP/5.0.4
    In der hppd.conf vom Appache ist nichts zu finden.
    In der php.ini habe ich die entsprechenden Werte schon derbe erhoeht aber da tut sich nichts (tile-28,15-sec).

    Code:
    max_execution_time = 600;
    max_input_time = 1200;
    memory_limit = 256M;

    Codeschnipsel

    Code:
    <?php
    ob_end_flush();
    
    $tiles = array_fill(1,60,'http://localhost/meinbild.php');
    $tileWidthHeight = 250;
    
    $dstImg =  imagecreatetruecolor (3500,2400);
    
    foreach ($tiles as $tileID => $tileLocation) {
    
    	$tile = imageCreateFromJPEG($tileLocation);  //editiert
    
    	echo "writing tile $tileID\n";
    	flush();
    
    	imageCopyMerge($dstImg,$tile,$offsetX,$offsetY, 0, 0,$tileWidthHeight,$tileWidthHeight,100);
    	imagedestroy($tile);
    	
    	$offsetX = $offsetX+$tileWidthHeight;
    	$offsetY = $offsetY+$tileWidthHeight; //falsch: wird im Orginalscript vorher berechnet und steigt nach einer Zeile um $tileWidthHeight
    
    }
    ?>
    Das Bild bekomme ich hierher (hier liegt auch irgendwo das Problem). Gebe ich das Bild einfach ohne imageCopy() aus rennt die Kiste.

    Code:
    <?php
    
    $srcOne ="grosses.jpg";   // knappe 3500 x 2400 px
    $srcTwo = "test.png"; // 250 x 250 px
    
    $result =  imagecreatetruecolor (250,250);
    $imgOne = imageCreateFromJPEG ($srcOne);
    $imgTwo = imageCreateFromPNG ($srcTwo);
    
    imageSaveAlpha($imgTwo, true);
    imageAlphaBlending($imgTwo, false);
    
    imageCopy ($result,$imgOne,0,0,0,0,250,250);
    imageCopy ($result,$imgTwo,0,0,0,0,250,250);
    
    Header("Content-type: image/jpeg");
    imageJPEG($result);
    
    imagedestroy($result);
    imagedestroy($imgOne);
    imagedestroy($imgTwo);
    
    ?>
    Beiss mir an dem Problem jetzt schon ne Ewigkeit die Zaehne aus, Hilfe ist mehr als willkommen.

    GreetinX
    Christian

  • #2
    $dstImg = imagecreatetruecolor (3500,2400);
    3500*2400=8400000
    4 byte je pixel (rgba) -> 33600000 bytes ~ 32M
    Passiert mit dstImg eigentlich irgendwas, ausser dass es in jedem Schleifendurchgang durch ein neues 32M imagecreatetruecolor überschrieben wird? Wie oft passiert das?

    Kommentar


    • #3
      Code:
      $dstImg = imagecreatetruecolor (3500,2400);
      ist ausversehen mit in die foreach gerutscht, der offset ist auch falsch, wird aber eingtlich vorher errechnet. (editiert s.o.)

      Das alles tut dem ganzen aber kein Abbruch, ich schaffe es jetzt bis "tile 29", dann tritt besagtes Problem wieder auf.

      Der Sinn von $dstImg ist es im Verlauf der Schleife komplett mit Bildfragmenten
      Code:
      $summeBildkacheln =  floor($bildBreite/$kachelBreite*floor($bildHoehe/$kachelHoehe);
      gefuellt zu werden um diese anschliessend auszugeben.

      Kommentar

      Lädt...
      X