[PHP] imagecreatefromjpeg

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben met PHP een fotoalbum aan het maken, waarbij het mogelijk is om via een webinterface foto's te uploaden die daarna worden verkleind tot 1024x768 pixels (genoeg voor de website waarop het gebruikt wordt) en dan op de schijf worden opgeslagen.

Het uploaden gaat goed, maar er is een probleem met het verkleinen van de foto's.
Hiervoor gebruik ik deze functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
private function Thumbnail( $uploadfile, $nw, $c )
{
    $img = imagecreatefromjpeg( $uploadfile );
    $ow=imagesx( $img );        // ow = old width
    $oh=imagesy( $img );        // oh = old height
    $scale=$nw/$ow;         // nw = new width, ow = old width
    $nh=ceil( $oh*$scale );     // nh = new height
    $newimg=imagecreatetruecolor( $nw,$nh );
    imagecopyresampled( $newimg,$img,0,0,0,0,$nw,$nh,$ow,$oh );
    imagejpeg( $newimg,$uploadfile, $c );
    return TRUE;
}


De functie kan ik aanroepen met: $this->Thumbnail( ) en tussen de haakjes de 3 parameters: locatie afbeelding, breedte van de afbeelding en jpeg-compressie.

Dat geeft het volgende probleem:
Warning: imagecreatefromjpeg(/opt/apache2/htdocs/fotos/228.jpeg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /opt/apache2/htdocs/beheer/_inc/fotoalbum.inc.php on line 366

Terwijl het bestand wel bestaat.
Als ik in de functie deze regel:
$img = imagecreatefromjpeg( $uploadfile );
vervang door dit:
$img = imagecreatefromjpeg( '/opt/apache2/htdocs/fotos/228.jpeg' );
werkt het wel.

Dus als de waarde wordt doorgegeven via een variabele werkt het niet. En als ik de waarde handmatig invoer werkt het wel.

Wat doe ik fout?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En wat krijg je te zien als je $uploadfile echot?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op vrijdag 19 augustus 2005 @ 10:37:
En wat krijg je te zien als je $uploadfile echot?
Dan krijg ik dit te zien: /opt/apache2/htdocs/fotos/230.jpeg

Zoals je hier kunt zien is dat bestand aanwezig, in tegenstelling tot wat die warning laat zien.
epauli@epauli:~% ls -sla /opt/apache2/htdocs/fotos/230.jpeg
608 -rw-r--r-- 1 nobody wheel 604836 Aug 19 11:01 /opt/apache2/htdocs/fotos/230.jpeg

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Het lijkt me vrijwel onmogelijk dat die functieaanroep wel werkt met een letterlijke string, maar niet met een variabele die precies dezelfde waarde bevat... Heb je $uploadfile wel binnen die functie uitgeprint, en niet de variabele die je gebruikt in het aanroepende stuk code?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op vrijdag 19 augustus 2005 @ 11:08:
Het lijkt me vrijwel onmogelijk dat die functieaanroep wel werkt met een letterlijke string, maar niet met een variabele die precies dezelfde waarde bevat... Heb je $uploadfile wel binnen die functie uitgeprint, en niet de variabele die je gebruikt in het aanroepende stuk code?
Ja, binnen de functie.

PHP:
1
2
3
4
5
6
7
private function Thumbnail( $uploadfile, $nw, $q )          
{
    print $uploadfile;
    $img = imagecreatefromjpeg( $uploadfile );
....
....
}


En dat levert dit resultaat op:

/opt/apache2/htdocs/fotos/230.jpeg
Warning: imagecreatefromjpeg(/opt/apache2/htdocs/fotos/230.jpeg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /opt/apache2/htdocs/beheer/_inc/fotoalbum.inc.php on line 367

Waarbij de eerste regel daarvan de echo/print is van $uploadfile en de drie regels eronder van $img = imagecreatefromjpeg( $uploadfile );

Volgens mij doe ik niks anders dan alle manuals.

[ Voor 3% gewijzigd door Verwijderd op 19-08-2005 11:22 ]


Acties:
  • 0 Henk 'm!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 18-09 22:12
Probeer eens: print ("\"".$uploadfile."\"");
In plaats van: print $uploadfile;

Kijk daarna ook in je HTML source of er niet stiekum een spatie of ander niet zichtbaar/slecht zichtbaar teken tussen staat.

[ Voor 11% gewijzigd door ShadowLord op 19-08-2005 12:25 ]

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ShadowLord schreef op vrijdag 19 augustus 2005 @ 12:24:
Probeer eens: print ("\"".$uploadfile."\"");
In plaats van: print $uploadfile;
Warning: imagecreatefromjpeg("/opt/apache2/htdocs/fotos/247.jpeg")
Kijk daarna ook in je HTML source of er niet stiekum een spatie of ander niet zichtbaar/slecht zichtbaar teken tussen staat.
Dat ziet er ook goed uit.

Het type van $uploadfile is volgens gettype() string.
Ik snap er niks meer van. 8)7

[ Voor 6% gewijzigd door Verwijderd op 19-08-2005 12:33 ]


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
doe zelf eens debuggen:

om te beginnen, wat gebeurd er als je een bestaande foto (bestaand op je webspace) gewoon hardcode?

als dat het wel doet dan ligt het dus aan de waarde van '$uploadfile', en anders niet.
en zo ga je dus allemaal dingen uitproberen.

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BasieP schreef op vrijdag 19 augustus 2005 @ 12:41:
om te beginnen, wat gebeurd er als je een bestaande foto (bestaand op je webspace) gewoon hardcode?
Bedoel je dit?
$img = imagecreatefromjpeg( '/opt/apache2/htdocs/fotos/228.jpeg' );

Dat heb ik al gedaan, zoals in het eerste bericht staat.
als dat het wel doet dan ligt het dus aan de waarde van '$uploadfile', en anders niet.
en zo ga je dus allemaal dingen uitproberen.
Wat kan er dan verkeerd zijn aan de waarde in $uploadfile?
Er staat precies in wat ik verwacht en het bestand waarvan de locatie in $uploadfile staat, bestaat echt.

Ik heb al van alles geprobeerd, sinds gistermiddag.

Acties:
  • 0 Henk 'm!

  • Vesta
  • Registratie: November 2004
  • Niet online
Gezien het feit dat het hardcoded wel werkt, moet er wel iets mis zijn met $uploadfile. Voer daarom een aantal checks uit, zoals strcmp(), file_exists(), is_readable() etc. Ik heb even snel een test in elkaar gezet:
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
90
91
function Thumbnail( $uploadfile, $nw, $c ) 
{ 
    /* Start debugging */
    error_reporting(E_ALL);
    $expected = '/opt/apache2/htdocs/fotos/228.jpeg';
    
    $error = '<font color="red"><b>Error</b></font>';
    $ok    = '<font color="green"><b>OK</b></font>';

    /* Data */
    printf('$uploadfile: %s<br>$expected: %s<br><br>', $uploadfile, $expected);
    
    /* Compare strings */
    $compare = strcmp($uploadfile, $expected) == 0 ? $ok : $error;
    printf('$uploadfile == $expected: %s<br>', $compare);
    
    /* Same files? */
    $uploadFileRealPath = realpath($uploadfile);
    $expectedRealPath   = realpath($expected);
    if($uploadFileRealPath == false){
        $uploadFileRealPath = $error;
    }
    if($expectedRealPath == false){
        $expectedRealPath = $error;
    }
    $compareRealpath = strcmp($uploadFileRealPath, $expectedRealPath) == 0 ? $ok : $error;
    printf('$uploadfile realpath(): %s<br>$expected realpath(): %s<br>Compare realpath(): %s<br>', $uploadFileRealPath, $expectedRealPath, $compareRealpath);
    
    /* Check whether files exists */
    $uploadfileExists = file_exists($uploadfile) ? $ok: $error;
    $expectedExists   = file_exists($expected)   ? $ok : $error;
    
    printf('$uploadfile file_exists(): %s<br>', $uploadfileExists);
    printf('$expected   file_exists(): %s<br>', $expectedExists);
    
    /* Check whether files are readable */
    $uploadfileReadable = is_readable($uploadfile) ? $ok : $error;
    $expectedReadable   = is_readable($expected)   ? $ok : $error;
    
    printf('$uploadfile is_readable(): %s<br>', $uploadfileReadable);
    printf('$expected   is_readable(): %s<br>', $expectedReadable);
    
    /* Double-check whether files are readable */
    $uploadfileFileCheck = $uploadfileReadable == $ok && file($uploadfile) ? $ok : $error;
    $expectedFileCheck   = $expectedReadable   == $ok && file($expected)   ? $ok : $error;
    
    printf('$uploadfile file(): %s<br>', $uploadfileFileCheck);
    printf('$expected   file(): %s<br>', $expectedFileCheck);
    
    /* Check whether files are really files */
    $uploadfileIsFile = is_file($uploadfile) ? $ok : $error;
    $expectedIsFile   = is_file($expected)   ? $ok : $error;
    
    printf('$uploadfile is_file(): %s<br>', $uploadfileIsFile);
    printf('$expected   is_file(): %s<br>', $expectedIsFile);
    
    /* Check file sizes */
    if($uploadfileIsFile == $ok){
        $uploadfileFilesize   = filesize($uploadfile);
        if($uploadfileFilesize == false){
            $uploadfileFilesize = $error;
        }
    }else{
        $uploadfileFilesize = $error;
    }
    
    if($expectedIsFile == $ok){
        $expectedFilesize   = filesize($expected);
        if($expectedFilesize == false){
            $expectedFilesize = $error;
        }
    }else{
        $expectedFilesize = $error;
    }
    
    printf('$uploadfile filesize(): %s<br>', $uploadfileFilesize);
    printf('$expected   filesize(): %s<br>', $expectedFilesize);
    
    return;
    /* End debugging */
    
    $img = imagecreatefromjpeg( $uploadfile ); 
    $ow=imagesx( $img );        // ow = old width 
    $oh=imagesy( $img );        // oh = old height 
    $scale=$nw/$ow;            // nw = new width, ow = old width 
    $nh=ceil( $oh*$scale );        // nh = new height 
    $newimg=imagecreatetruecolor( $nw,$nh ); 
    imagecopyresampled( $newimg,$img,0,0,0,0,$nw,$nh,$ow,$oh ); 
    imagejpeg( $newimg,$uploadfile, $c ); 
    return TRUE; 
}
Als het goed is krijg je minimaal 1x "Error" waar je verder mee kunt debuggen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Vesta schreef op vrijdag 19 augustus 2005 @ 13:38:
Als het goed is krijg je minimaal 1x "Error" waar je verder mee kunt debuggen.
Ok, probleem gevonden.
Het was echter geen probleem in de functie Thumbnail, maar ergens anders in de code.
De functie Thumbnail riep ik te vroeg aan, al voordat het bestand was geupload. |:( :Z

8)7

[ Voor 95% gewijzigd door Verwijderd op 19-08-2005 14:13 ]


Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
Ik was 2 weken geleden bezig met een zelfde functie voor het maken van thumbnails. Ik kreeg het niet aan de gang met gebruik van de imagesx() en imagesy() functies. Dus heb ik een andere manier gebruikt om de oorspronkelijke hoogte en breedte te achterhalen. Toen werkte de functie wel :) Ik heb geen idee waarom het niet met die functies lukte.

Ik post maar even de exacte functie en waar ik de maten vandaan haal omdat ik op mijn werk zit en geen tijd heb om de functie te strippen tot alleen dat wat jij misschien kunt gebruiken.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$imgSize = getimagesize($fileUrl);
create_thumb('plaatje.jpg', 'fotos', 'Nieuwe naam plaatje', $imgSize, '50', '100');

function create_thumb($fileName, $subDir, $thumbName, $sizeArray, $thumbnail_quality, $thumbnail_size){
    $thumbUrl = $subDir ."/thumbs/". $thumbName;
    $origWidth = $sizeArray[0];
    $origHeight = $sizeArray[1];
    $newHeight = $thumbnail_size;
    $newWidth = $origWidth*(($newHeight/($origHeight/100))/100);

    $thumb = ImageCreateTruecolor($newWidth, $newHeight);
    $source = ImageCreateFromJPEG($subDir."/".$fileName);
    imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newWidth, $newHeight, $origWidth, $origHeight);
    imagejpeg($thumb, $thumbUrl, $thumbnail_quality);
}

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Bram77: waar komt $imgSize op regel 2 vandaan? Je verplaatst nu volgens mij het probleem.

Acties:
  • 0 Henk 'm!

  • Vesta
  • Registratie: November 2004
  • Niet online
GlowMouse: kijk eens op regel 1 ;)

[ Voor 3% gewijzigd door Vesta op 19-08-2005 14:55 ]

Pagina: 1