[PHP] Image verkleinen, wat gaat er fout?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer een plaatje dat wordt geupload met php zo aan te passen dat het plaatje naar de juiste breedte wordt geresized, en daarna alles wat te hoog is er afgeknipt wordt. Het lukte al eerder met een scriptje, maar dat was het verkleinen van een plaatje wat al op de server staat. Ik heb nu de volgende 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
90
91
92
93
94
$path = $_SERVER['DOCUMENT_ROOT']."$root2"."/$article_images_folder/";

if ($_FILES[thumbnail_upload] != "")
    {
    if (!is_uploaded_file($_FILES['thumbnail_upload']['tmp_name'])) 
        {
        $update .= "- Je hebt geen bestand geselecteerd om te uploaden. <br>";
        } 
    else 
        {
        $thumbnail = "\r\n".$_FILES['thumbnail_upload']['name']; 
            
        if (file_exists("$path$thumbnail"))
            {
            $update .= "<font color=red><b>!!!</b></font> Het bestand <b>$thumbnail</b> bestaat al in de folder $article_images_folder <font color=red><b>!!!</b></font> <br>";
            }
        else
            {               
            $blah = $_FILES['thumbnail_upload']['tmp_name'];
            $blah2 = $_FILES['thumbnail_upload']['name'];
            
            copy($blah,"$path".$blah2);
            
            //Upload file
            $height = 200;
            $width = 200;
            
            $handle = imagecreatefromjpeg($path.$blah2);
            
            $srcWidth  = imagesx($handle);
            $srcHeight = imagesy($handle);
                        
               if($srcHeight < $srcWidth)
               {
                   $ratio = (double)($srcHeight / $height);
            
                   $cpyWidth = round($width * $ratio);
                   if ($cpyWidth > $srcWidth)
                   {
                       $ratio = (double)($srcWidth / $width);
                       $cpyWidth = $srcWidth;
                       $cpyHeight = round($height * $ratio);
                       $xOffset = 0;
                       $yOffset = round(($srcHeight - $cpyHeight) / 2);
                   } else {
                       $cpyHeight = $srcHeight;
                       $xOffset = round(($srcWidth - $cpyWidth) / 2);
                       $yOffset = 0;
                   }
            
               } else {
                   $ratio = (double)($srcWidth / $width);
            
                   $cpyHeight = round($height * $ratio);
                   if ($cpyHeight > $srcHeight)
                   {
                       $ratio = (double)($srcHeight / $height);
                       $cpyHeight = $srcHeight;
                       $cpyWidth = round($width * $ratio);
                       $xOffset = round(($srcWidth - $cpyWidth) / 2);
                       $yOffset = 0;
                   } else {
                       $cpyWidth = $srcWidth;
                       $xOffset = 0;
                       $yOffset = round(($srcHeight - $cpyHeight) / 2);
                   }
               }
               
              $newHandle = imagecreatetruecolor($width, $height);
            
              imagecopyresampled($newHandle, $handle, 0, 0, $xOffset, $yOffset, $width, $height, $cpyWidth, $cpyHeight);
              
              imagejpeg($newHandle, $blah2, 80);
               
              imagedestroy($newHandle);
              imagedestroy($handle);
            
            $thumbnail_name = "$thumbnail";
            $thumbnail = trim($thumbnail);
            $domain = $_SERVER['HTTP_HOST'];
            if ($root != "") { $root3 = "$root/"; }
            $thumbnail = "http://$domain/$root3$article_images_folder/$thumbnail";
            
            if (file_exists("$path$blah2"))
                {
                $update .= "+ Je hebt het bestand <b>$thumbnail_name</b> geupload naar de folder <b>$article_images_folder</b>. <br>";
                }
            else
                {
                $update .= "<font color=red>Upload gefaald. Reden onbekend. </font> <br>";
                }
            }
        }
    }


thumbnail_upload is in dit geval het plaatje dat wordt geupload. Met de copy functie maakt hij dan eerst het plaatje aan in de folder. Vervolgens pakt hij dat plaatje weer op en resized em dan. Helaas krijg ik de volgende error:

PHP:
1
Warning: imagejpeg(): Unable to open 'xbox360logo2.jpg' for writing in /home/rottens/domains/siteadres.nl/public_html/admin/articles.php on line 382


'xbox360logo2' is natuurlijk het plaatje dat geupload wordt. Hij kan dus wel het plaatje vinden, maar niet openen (of de folder is misschien verkeerd?). Kan iemand mij uitleggen wat ik verkeerd doe?

Ik ben nog een beetje nieuw met het hele gebruik van php om plaatjes aan te passen, dus vergeef mij mij als de code niet helemaal optimaal is ;)

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Op de map waarin het plaatje geupload wordt heb je geen schrijfrechten. CHMOD die map eens naar 755 of iets dergelijks en probeer het dan nog eens. Mogelijk dat je diezelfde foutmelding ook krijgt bij het openen van een bestand in een niet-bestaande folder, maar of dat het geval is kun je natuurlijk alleen zelf uitzoeken. ;)

[ Voor 38% gewijzigd door NMe op 23-01-2006 17:49 ]

'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
die map staat al op 777. Het plaatje echter staat op 644, moet deze ook op 755 of 777 gezet worden? en, zo ja, kan je dit met een php code automatisch tijdens het uploaden laten doen?

Acties:
  • 0 Henk 'm!

  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 19-08 16:06

ripperke

w00t!

lijkt me dat rechten op map juist staan, anders zou de file niet kunnen uploaden.
lijkt me dus dat je nadat je je file hebt geupload & voor je hem gaan croppen moet chmodden (php heeft hier functie voor)

zet op regel 27 eens
PHP:
1
chmod($path.$blah2, 0777);

offtopic:
chmod 755 is read & execute ;) 777 of 766 lijkt me beter

[ Voor 12% gewijzigd door ripperke op 23-01-2006 17:52 ]

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
plaatje wordt nu wel op 777 gezet (heb gechecked in ftp ook), maar nog steeds dezelfde error.

De regel waar de error naar verwijst is trouwens regel 73. Betekend dit dat hij in de voorgaande functies het plaatje wel kon openen?

[ Voor 43% gewijzigd door Verwijderd op 23-01-2006 17:59 ]


Acties:
  • 0 Henk 'm!

  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 19-08 16:06

ripperke

w00t!

PHP:
1
imagejpeg($newHandle, $blah2, 80);


moet dat niet

PHP:
1
imagejpeg($newHandle, $path.$blah2, 80);


zijn?

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
je hebt gelijk, $path moest er nog voor. Lekker stom van me |:( Het zijn ook altijd van die kleine foutjes in een code...

Iedereen bedankt voor hun hulp! Het werkt nu goed :)

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

8)7

Trouwens, om dit te voorkomen en tegelijkertijd een marginaal performanceboostje te krijgen: doe dit soort operaties maar één keer. Je plakt nu elke keer opnieuw $path voor je variabele. Waarom doe je dat niet eenmalig, en sta je dat op in een variabele? Dan hoef je steeds alleen maar die ene var te hebben. ;)

Trouwens, waar gaat dit over?
PHP:
1
$path = $_SERVER['DOCUMENT_ROOT']."$root2"."/$article_images_folder/";

en dit:
PHP:
22
            copy($blah,"$path".$blah2);

Waarom zou je nog eens extra quotes om je variabele zetten? Die quotes zijn nergens voor nodig. Los daarvan vind ik het persoonlijk een beetje rommelig overkomen dat je de ene keer de concatenation operator (de . ) gebruikt, en de andere keer gewoon variabelen tussen een string met dubbele quotes zet. Kies het een of het ander en gebruik dat door je hele script, dat bevordert de duidelijkheid. :)

'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
komt omdat ik een cms heb gekocht en die zelf nu aan mij eisen aanpas. Het $path wordt later in het script nog meerdere malen gebruikt voor andere doeleinden (naar andere folders linken enzo). Kan ik natuurlijk nog een $path2 maken die dan meerdere keren voorkomt in dit script natuurlijk... De hele code moet nog nagekeken worden en schoongemaakt, maar ik wil eerst gewoon alles werkend hebben.

Nog een vraagje over het aanpassen van plaatjes. Ik probeer nu dat er automatisch een tekst aan toegevoegd wordt. Heb nu de volgende code: (deze sluit aan op de andere hierboven, dus hij pakt gewoon weer de $newHandle. De imagedestroys heb ik natuurlijk wel verplaatst zodat die hieracther komen:

PHP:
1
2
3
4
5
$white = imagecolorallocate($newHandle, 255, 255, 255);
                 
$font = '../images/font/xbox.ttf';
                
imagettftext($newHandle, 20, 0, 10, 20, $white, $font, $title);


Hij geeft de error:
PHP:
1
Fatal error: Call to undefined function: imagettftext() in ....


wat is hier fout aan?

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

'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
ok, freetype support staat uit (bool(false)). Is er een mogelijkheid om dit zelf aan te zetten, of moet de host dan iets installeren / instellen ?
Pagina: 1