Archief - PHP: imagecreatejpeg() memory problem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

blackrabbit

Legacy Member
Wanneer ik imagecreatefromjpeg() een afbeelding (jpg) meegeef die groter is dan 500KB, krijg ik memory limit foutmeldingen:

Fatal error: Allowed memory size of 16777216 bytes exhausted at (null):0 (tried to allocate 9088 bytes) in /[pagina] on line 97
ZOals je ziet heb ik de 'memory_limit' (in php.ini) al op 16M gezet (std: 8M), maar daarmee blijk ik ook al niet toe te komen..

Het is enkel die functie die geheugen lijkt te vreten, net vóor ik die functie aanroep heb ik nog maar 130KB gebruikt..

Ik heb al geprobeerd de memory_limit nog hoger te zetten (20,24,32) maar als ik dat doe verschijnt er gewoon niets meer op die pagina..

Doel van het hele zootje is om thumbnails te maken van de images die ik upload, en die kunnen tot 2MB groot zijn..

Voor alle duidelijkheid: voor kleinere images (300KB ofzo) is er geen enkel probleem..


MOD:
het probleem ligt blijkbaar niet direct bij de filegrootte, maar eerder by de image-size: afbeeldingen van 2272x1704pixels lijken problemen te geven...

Ex0dus

Legacy Member
Strange, mijn host heeft hier geen problemen mee (.jpg van 790kb)

:x

Zero Grav

Legacy Member
Volgens mij is het probleem dat em 1st (clearly) teweinig geheugen heeft voor de verwerking en dat de verwerking te lang duurt (en dus stopgezet wordt) als ge die limiet omhoogtrekt.

Ge kunt natuurlijk altijd een max width & height op de geuploade afbeeldingen zetten, anders zie'k ook ni onmiddellijk een oplossing.

PerfectPC

Legacy Member
een afbeelding van 2272 x 1704 in true color (32bit) is al 15486024 B (14,77 MB) groot, uw geheugen gaat dus idd overvol zitten met 16 MB. wat ge kunt doen is uw mem limit op 24 (of gelijkaardig) zetten en ook uw max execution time verhogen. dan moet ge wat langer wachten, maar zal het wel werken (steek die thumbs dan wel in een cache hé !)

uw fotos op voorhand een beetje verkleinen is ook een optie, maar dan zijt ge uw exif data kwijt, en dat is ook jammer.

ik ben een scriptje aant schrijven waarbij de originelen die ercht uit de camera komen hier lokaal gehost worden en dat mn webscript die gaat cachen in kleiner formaat en thumbnail formaat en waarbij de exif data nog altijd uitgelezen kan worden (eventueel gecached in een database)

blackrabbit

Legacy Member
Die pics zijn reeds in JPEG opgeslagen (komen van digicam), en die zijn max 2MB groot..
'host' is trouwens serverke bij mij thuis (script dient ook enkel voor lokaal gebruik). Indien het van pas kan komen wil ik phpinfo() hier wel eens posten..

@Exodus: probleem was ook niet echt meer de bestandsgrootte (zie edit) maar eerder combinatie van imagegrootte en bestandgrootte. Het uploaden zelf is trouwens het probleem niet, enkel die afbeelding door imagecreatefromjpeg() halen geeft problemen.

Foto's op voorhand verkleinen is nu net wat ik wil voorkomen.. Ze mogen gerust allemaal door het script op bvb 1600*1200 (max) opgeslagen worden, maar ze zelf manueel aanpassen was nu net wat ik niet wil :)

ZOu het anders niet dmv javascript geresized kunnen worden net voordat ik het upload? (ken weinig van JS, enkel basis eigenlijk)

blackrabbit

Legacy Member
Tis echt gewoon de image-size.
Heb nu een foto van 1600x1200 @250KB geprobeerd, en script werd niet uitgevoerd...

Zelfde foto, 1200x800 @ 800KB gaf geen problemen..

PHP:
function createThumb($sfile,$dfile) 
{
	// the passed variables are string filenames, the source and the destination 
	$maxwidth=100;
	$maxheight=100; 

	$simg = LoadJpeg($sfile); 
	$currwidth=imagesx($simg); 
	$currheight=imagesy($simg); 
                      
	//set the dimensions of the thumbnail 
	if ($currheight>$currwidth*1.7) 
	{ 
		$zoom=$maxheight/$currheight; 
		$newheight=$maxheight; 
		$newwidth=$currwidth*$zoom; 
	} 
	else 
	{ 
		$zoom=$maxwidth/$currwidth; 
		$newwidth=$maxwidth; 
		$newheight=$currheight*$zoom; 
	} 

	//create the resource img for the thumbnail 
	$dimg = imagecreate($newwidth, $newheight); 
//HIER LOOPT HET FOUT

	//convert truecolor image resource to palette image resource (so we can count the colors...) 
	ImageTrueColorToPalette($simg, false, 256); 
	$palsize = ImageColorsTotal($simg); 
	for ($i = 0; $i<$palsize; $i++) 
	{ 
		$colors = ImageColorsForIndex($simg, $i); 
		ImageColorAllocate($dimg, $colors['red'], $colors['green'], $colors['blue']); 
	} 

	imagecopyresized($dimg, $simg, 0, 0, 0, 0, $newwidth, $newheight, $currwidth, $currheight); 
	imagejpeg($dimg,$dfile); 

	ImageDestroy($simg); 
	ImageDestroy($dimg); 

}

PerfectPC

Legacy Member
blackrabbit zei:
Die pics zijn reeds in JPEG opgeslagen (komen van digicam), en die zijn max 2MB groot..
*zucht* betweter...
uw brondbestand is ne jpeg ja, en uw eindresultaat waarschijnlijk ook. maar der is nog altijd geen enkel programma dat kan toveren met gecomprimeerdere data. dat moet ALTIJD (voor bewerkingen aan het beeld althans) gedecomprimeerd worden naar een bitmap formaat. en laat het nu net die bitmap zijn die zoveel geheugen inneemt.

dus geloof me nu maar en verhoog de max exection time en de memory limit, en ge zult zien dat het dan wel werkt.

blackrabbit

Legacy Member
*zucht*
Spreek ik u tegen misschien?

MOD: even herlezen: wou vooral voorkomen dat werd aangenomen dat ik bestanden van 15MB probeerde te uploaden...


Enfin, before this goes the wrong way: waarom krijg ik niet gewoon een 'execution time exceeded error'? Als ik 'top', zie ik dat httpd trouwens niet al te veel resources gebruikt..

Maar goed, zal ook de execution time verhogen en zien wat dat geeft...

New numbers: 32MB & 90sec, werkt nog niet..
Krijg een 'The page cannot be displayed' (zoals vaak gebeurd).

Heb daar trouwens iets over gelezen:
imagecreatefromjpeg() returns an empty string on failure. It also outputs an error message, which unfortunately displays as a broken link in a browser. To ease debugging the following example will produce an error JPEG: Voorbeeld 1. Example to handle an error during creation (courtesy vic at zymsys dot com )

<?php
function LoadJpeg($imgname)
{
$im = @imagecreatefromjpeg($imgname); /* Attempt to open */
if (!$im) { /* See if it failed */
$im = imagecreate(150, 30); /* Create a blank image */
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
/* Output an errmsg */
imagestring($im, 1, 5, 5, "Error loading $imgname", $tc);
}
return $im;
}
?>
Maar als ik die functie gebruik, werkt niets...

dJeez

Legacy Member
Al eens geprobeerd om ImageMagick te gebruiken om je thumbnails te genereren? 'k Heb hier nu wel geen tijd of testimages van dergelijke grootte staan maar moet toch dringend eens wat foto's van m'n Nikon D70 online zetten, dus zal 't vanavond (als ik 't niet vergeet tenminste :p) eens uittesten.

blackrabbit

Legacy Member
Toevallig geprobeerd?
Heb MagicWand gedownload, maar wacht liever met de installatie tot ik weet of het effectief ook gaat helpen :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan