GD-LIB: TrueColor
Tom
- php
0 Tom0 Sven Rautenberg0 Tom
0 Sven Rautenberg
Hello,
könnt Ihr mir sagen, wieviele Bits und wieviele Kanäle
ImageCreateTrueColor() verschlingt?
http://de2.php.net/manual/de/function.imagecreatetruecolor.php
Ich würde jetzt mal raten 8 Bits, 3 Kanäle.
Es geht um die Berechnung des Speicherbedars.
function image_check_memory($_imageinfo) ## X, Y, bits, channels
{
$memoryNeeded = round(($_imageinfo[0] * $_imageinfo[1] * $_imageinfo['bits'] * $imageinfo['channels'] / 8 + 65536) * 1.65);
$memoryLimit = (int) ini_get('memory_limit') * 1048576;
if ((memory_get_usage() + $memoryNeeded) + MEMORY_LEFT > $memoryLimit) return false;
return true;
}
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hello,
nur für's Archiv.
Bisher klappt das so ganz gut.
Keiner der Tests hat bisher einen Out-of-Memory gegeben
function image_check_memory($_imageinfo, $memleft = MEMORY_LEFT) ## (X, Y, bits, channels), Rest
{
## fehlende Angaben durch Raten ergänzen
if (!isset($_imageinfo['bits'])) $_imageinfo['bits'] = 8;
if (!isset($_imageinfo['channels']) and $_imageinfo['bits'] == 24) $_imageinfo['channels'] = 1;
if (!isset($_imageinfo['channels'])) $_imageinfo['channels'] = 3;
$memoryNeeded = round(($_imageinfo[0] * $_imageinfo[1] * $_imageinfo['bits'] * $_imageinfo['channels'] / 8 + 65536) * 1.65);
$memoryLimit = intval(ini_get('memory_limit')) * 1048576;
if ((memory_get_usage() + $memoryNeeded) + $memleft > $memoryLimit)
{
error_log('IMAGE_MEMORY usage: '.memory_get_usage().", needed: $memoryNeeded, limit: $memoryLimit\n", 3, '/var/log/web04/php_error_log');
return false;
}
return true;
}
getimagesize() liefert nur ncht immer Werte für bits und channels.
So gut gefällt mir das daher noch nicht.
Wenn man aber einen Stapel mit 300 unterschiedlichen Grafiken abarbeiten will, soll die Schleife nicht mittendrin aussteigen.
Harzliche Grüße vom Berg
<http://bergpost.annerschbarrich.de>
Tom
--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

Moin!
getimagesize() liefert nur ncht immer Werte für bits und channels.
So gut gefällt mir das daher noch nicht.Wenn man aber einen Stapel mit 300 unterschiedlichen Grafiken abarbeiten will, soll die Schleife nicht mittendrin aussteigen.
ImageMagick nutzen. Oder die Speicherbegrenzung von PHP entfernen. Kommt beides auf dasselbe raus.
- Sven Rautenberg
Hello,
getimagesize() liefert nur ncht immer Werte für bits und channels.
So gut gefällt mir das daher noch nicht.Wenn man aber einen Stapel mit 300 unterschiedlichen Grafiken abarbeiten will, soll die Schleife nicht mittendrin aussteigen.
ImageMagick nutzen. Oder die Speicherbegrenzung von PHP entfernen. Kommt beides auf dasselbe raus.
Naja, ich habe es damals in der Agentur, schon geschafft, mit 128MB Speicher für das Script nicht auszukommen. Die GD-LIB ist da gnadenlos.
Leider sind alle Lösungen, die ich damals schon erarbeitet hatte, samt PC und Datansicherungs-Platte bei einem Einbruch geklaut worden. Sonst habe ich sie immer mit nach Hause genommen, nur ausgerechnet an diesem Tag hatte ich es vergessen :-((
Ich erinnere mich auch dunkel daran, dass ich da eine andere Abfragefunktion aufgetrieben/bzw. aus mehreren zusammenbaut hatte, die mir bessere Informationen geliefert hat über das zu verarbeitende Bild und auch gleich ausgerechnet hat, wieviel Speicher dies beim Auspacken verschlingen würde.
Ich habe schon alle möglichen Suchmaschinen gequält, kann mich aber auch nicht mehr entsinnen, wonach ich damals wohl gessucht haben könnte.
Wenn also noch jemand einen Tipp hätte, wäre ich hoch erfreut...
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Moin!
könnt Ihr mir sagen, wieviele Bits und wieviele Kanäle
ImageCreateTrueColor() verschlingt?
http://de2.php.net/manual/de/function.imagecreatetruecolor.phpIch würde jetzt mal raten 8 Bits, 3 Kanäle.
Alphatransparenz verbraucht auch noch Speicher. Die gdlib verarbeitet ja problemlos 24-Bit-PNGs mit Halbtransparenz, das geht nur, wenn 32 Bits pro Pixel benutzt werden (auch wenn seltsamerweise der Alpha-Kanal der gdlib nur 7 Bit hat - warum auch immer.
- Sven Rautenberg