teveel geheugen gebruik
Maar momenteel ben ik met een site bezig waarbij de thumbnails allemaal gecropped moeten worden. Toen werd het dus een beetje puzzelen met kant en klare scriptjes, tot ik iets gecombineerd had wat werkte. Of althans, in bepaalde mate.
Als ik foto's van minder dan 2 MB probeer te uploaden is er geen probleem. Maar als ik een foto van bijv. 4 MB probeer te uploaden krijg ik de volgende melding:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 17152 bytes) in .../httpdocs/simpleimage.php on line 33
Misschien een beetje een domme vraag, maar een foto van 4 MB is toch geen 32 MB? Or heeft het hier niets mee te maken? En zo niet, waar komt het dan door?
Voor de duidelijkheid hier even het complete script erbij, inclusief het database gedeelte voor de volledigheid:
Code (php)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
include("simpleimage.php");
//check wat de titel van het plaatje moet worden
$sqlGetTitle = "SELECT * FROM fotoboek ORDER BY fotoboek_url DESC";
$resultGetTitle = mysql_query($sqlGetTitle);
$rowGetTitle = mysql_fetch_array($resultGetTitle,MYSQL_ASSOC);
$previousTitle = $rowGetTitle['fotoboek_url'];
$title = $previousTitle + 1;
//check wat het volgnummer moet worden
$sqlGetSeq = "SELECT * FROM fotoboek ORDER BY fotoboek_volgnr DESC";
$resultGetSeq = mysql_query($sqlGetSeq);
$rowGetSeq = mysql_fetch_array($resultGetSeq,MYSQL_ASSOC);
$previousSequencenumber = $rowGetSeq['fotoboek_volgnr'];
$sequencenumber = $previousSequencenumber + 1;
// grote afbeeldingen
list($width, $height, $type, $attr) = getimagesize($_FILES['foto']['tmp_name']);
if ($width < $height){
$size = (550/$height) * $width;
$hg = "550";
$bg = round($size);
} elseif($width > $height){
$size = (550/$width) * $height;
$hg = round($size);
$bg = "550";
} else {
$bg = "550";
$hg = "550";
}
$ext = ".jpg";
$imagelocation = "afbeeldingen/fotoboek/" . $title . "." . jpg;
$image = new SimpleImage();
$image->load($_FILES['foto']['tmp_name']);
$image->resize($bg,$hg);
$image->save($imagelocation);
// verkleinen voor de thumbs zodat ze uitgesneden kunnen worden
list($width, $height, $type, $attr) = getimagesize($_FILES['foto']['tmp_name']);
if ($width > $height){
$size = (156/$height) * $width;
$hg = "156";
$bg = round($size);
} elseif($width < $height){
$size = (156/$width) * $height;
$hg = round($size);
$bg = "156";
} else {
$bg = "156";
$hg = "156";
}
$ext = ".jpg";
$thumblocation = "afbeeldingen/fotoboek/" . $title . "_klein." . jpg;
$image = new SimpleImage();
$image->load($_FILES['foto']['tmp_name']);
$image->resize($bg,$hg);
$image->save($thumblocation);
//uitsnijden van de verkleinde images
list($current_width, $current_height) = getimagesize($thumblocation);
if ($current_width > $current_height){
$left = (($current_width - 156)/2);
$top = 0;
} elseif($current_width < $current_height){
$top = (($current_height - 156)/2);
$left = 0;
} else {
$left = 0;
$top = 0;
}
$crop_width = 156;
$crop_height = 156;
$canvas = imagecreatetruecolor($crop_width, $crop_height);
$current_image = imagecreatefromjpeg($thumblocation);
imagecopy($canvas, $current_image, 0, 0, $left, $top, $current_width, $current_height);
imagejpeg($canvas, $thumblocation, 100);
//ze de titel en volgnummer in de database
$sqlInsert = "INSERT INTO fotoboek (fotoboek_url, fotoboek_volgnr) VALUES ('$title', '$sequencenumber')";
$resultInsert = mysql_query($sqlInsert);
?>
include("simpleimage.php");
//check wat de titel van het plaatje moet worden
$sqlGetTitle = "SELECT * FROM fotoboek ORDER BY fotoboek_url DESC";
$resultGetTitle = mysql_query($sqlGetTitle);
$rowGetTitle = mysql_fetch_array($resultGetTitle,MYSQL_ASSOC);
$previousTitle = $rowGetTitle['fotoboek_url'];
$title = $previousTitle + 1;
//check wat het volgnummer moet worden
$sqlGetSeq = "SELECT * FROM fotoboek ORDER BY fotoboek_volgnr DESC";
$resultGetSeq = mysql_query($sqlGetSeq);
$rowGetSeq = mysql_fetch_array($resultGetSeq,MYSQL_ASSOC);
$previousSequencenumber = $rowGetSeq['fotoboek_volgnr'];
$sequencenumber = $previousSequencenumber + 1;
// grote afbeeldingen
list($width, $height, $type, $attr) = getimagesize($_FILES['foto']['tmp_name']);
if ($width < $height){
$size = (550/$height) * $width;
$hg = "550";
$bg = round($size);
} elseif($width > $height){
$size = (550/$width) * $height;
$hg = round($size);
$bg = "550";
} else {
$bg = "550";
$hg = "550";
}
$ext = ".jpg";
$imagelocation = "afbeeldingen/fotoboek/" . $title . "." . jpg;
$image = new SimpleImage();
$image->load($_FILES['foto']['tmp_name']);
$image->resize($bg,$hg);
$image->save($imagelocation);
// verkleinen voor de thumbs zodat ze uitgesneden kunnen worden
list($width, $height, $type, $attr) = getimagesize($_FILES['foto']['tmp_name']);
if ($width > $height){
$size = (156/$height) * $width;
$hg = "156";
$bg = round($size);
} elseif($width < $height){
$size = (156/$width) * $height;
$hg = round($size);
$bg = "156";
} else {
$bg = "156";
$hg = "156";
}
$ext = ".jpg";
$thumblocation = "afbeeldingen/fotoboek/" . $title . "_klein." . jpg;
$image = new SimpleImage();
$image->load($_FILES['foto']['tmp_name']);
$image->resize($bg,$hg);
$image->save($thumblocation);
//uitsnijden van de verkleinde images
list($current_width, $current_height) = getimagesize($thumblocation);
if ($current_width > $current_height){
$left = (($current_width - 156)/2);
$top = 0;
} elseif($current_width < $current_height){
$top = (($current_height - 156)/2);
$left = 0;
} else {
$left = 0;
$top = 0;
}
$crop_width = 156;
$crop_height = 156;
$canvas = imagecreatetruecolor($crop_width, $crop_height);
$current_image = imagecreatefromjpeg($thumblocation);
imagecopy($canvas, $current_image, 0, 0, $left, $top, $current_width, $current_height);
imagejpeg($canvas, $thumblocation, 100);
//ze de titel en volgnummer in de database
$sqlInsert = "INSERT INTO fotoboek (fotoboek_url, fotoboek_volgnr) VALUES ('$title', '$sequencenumber')";
$resultInsert = mysql_query($sqlInsert);
?>
Gewijzigd op 09/05/2011 17:39:40 door Marlies Maalderink
Een (reken)voorbeeldje
Foto van 2000x3000pixels -> 6000000 (6milj.) pixels
Een jpg heeft 16miljoen kleuren. Dat is 2 tot de macht 24 (ja dus een zgn. 24bits bestand)
En 24 bit is 3 Byte. Dus dan zitten we op 18000000 Bytes
Ja, en waarom deze getallen ? Omdat als je de foto (met de GD routine) wil gaan bewerken dan moet ie eerst in zijn geheel in het werkgeheugen staan! En voor de meeste bewerkingen ook nog eens 2x ! De originele versie EN de bewerkte versie !
Dan heb je dus al 36000000 bytes nodig !
Je hebt het over uploaden en dat zit niet in dit script.