Versio

teveel geheugen gebruik

Overzicht Reageren

Marlies Maalderink

Marlies Maalderink

09/05/2011 17:38:52
Quote Anchor link
Ik wil een fotoupload functie maken waarbij de tumbnails automatisch gekropt worden. Nu heb ik niet genoeg php ervaring om zelf zo'n script te schrijven, maar heb in het verleden vaak met veel succes gebruik gemaakt van het "SimpleImage.php" script (vast wel bekend).

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);

?>
Gewijzigd op 09/05/2011 17:39:40 door Marlies Maalderink
 
PHP hulp

PHP hulp

25/05/2012 16:18:00
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
- Roland -

- Roland -

09/05/2011 18:02:53
Quote Anchor link
4MB op harde schijf zegt heel weinig!

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 !
 
- SanThe -

- SanThe -

09/05/2011 18:11:34
Quote Anchor link
Je hebt het over uploaden en dat zit niet in dit script.
 



Overzicht Reageren

Get Adobe Flash player