Avatar billede asn24 Nybegynder
16. maj 2008 - 02:30 Der er 19 kommentarer og
1 løsning

imagecopyresampled og imagejpeg?

Hey gutter!

Jeg sidder og nørkler lidt med at lave en thumbnail funktion, men jeg kan simpelthen ikke få det til at virke.

Jeg får disse fejl

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /var/www/jordegern.dk/public_html/inc/functions.php on line 102

Warning: imagejpeg(): supplied argument is not a valid Image resource in /var/www/jordegern.dk/public_html/inc/functions.php on line 105

Med denne kode (Uddrag, kun upload af billeder) :

function upload_image() {
       
        if (isset($_POST["title"]) && $_FILES['image']['size'] > 0) {
            $file_name = $_FILES['image']['name'];
            $tmp_name  = $_FILES['image']['tmp_name'];
            $file_size = $_FILES['image']['size'];
            $file_type = $_FILES['image']['type'];
           
            $fp      = fopen($tmp_name, 'r');
            $content = fread($fp, filesize($tmp_name));
            $content = addslashes($content);
            fclose($fp);   
               
            $image_type = explode("/", $file_type);   
           
            $image_dimensions = getimagesize($tmp_name);
            $width = $image_dimensions[0];
            $height = $image_dimensions[1];
           
               
            if ($file_size > 2097152) {
                echo "Billedet er større end 2 Mb, og kan derfor ikke uploades.";
            } elseif ($image_type[1] !== "jpeg" && $image_type[1] !== "png" && $image_type[1] !== "gif") {
                echo "Billedet er af typen " . $image_type[1] . ", og kan derfor ikke uploades. Formatet skal være JPEG, JPG, GIF eller PNG";
            } else {
           
               
                //Image resize
                //Target size in pixel                                               
                $target = 200; //px                                                       

                    if ($width > $height) {                                            
                    $percentage = ($target / $width);                                    
                    } else {                                                            
                    $percentage = ($target / $height);                                    
                    }                                                                    
                //gets the new value and applies the percentage, then rounds the value    
                    $thumb_width = round($width * $percentage);                        
                    $thumb_height = round($height * $percentage);                        
               
                //Create thumbnail                   
                $thumb = imagecreatetruecolor($thumb_width, $thumb_height);
                $thuumb = imagecopyresampled ($thumb, $_FILES["image"]["tmp_name"], 0, 0, 0, 0, $width, $height, $thumb_width, $thumb_height);
                //imagecopyresampled(resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)
                if ($image_type[1] == "jpeg") {
                    $thumb = imagejpeg($thuumb);
                } elseif ($image_type[1] == "png") {
                    $thumb = imagepng($thuumb);
                } elseif ($image_type[1] == "gif") {
                    $thumb = imagegif($thuumb);
                }               
                   
                $image_sql = "INSERT INTO `" . _MYSQL_GALLERY . "` SET `thumb_width` = '" . $thumb_width . "', `thumb_height` = '" . $thumb_height . "', `thumb` = '" . $thumb . "', `width` = '" . $width . "', `height` = '" . $height . "', `image` = '" . $content . "', `title` = '" . mysql_real_escape_string($_POST["title"]) . "', `description` = '" . mysql_real_escape_string($_POST["description"]) . "', `user_id` = '1', `type` = '" . $file_type . "'";
                $image_query = mysql_query($image_sql) or die(mysql_error());
               
                    echo "Billede successfuldt uploadet.<br /><br /><a href=\"?show=all\">Galleriforside</a><br /><a href=\"?user=1\">Dit galleri</a><br />";
               
            }
        }
}
?>

Håber der er nogen der ude der kan finde min fejl..
Avatar billede jakobdo Ekspert
16. maj 2008 - 06:37 #1
Du kunne også tage et kig på min artikel som netop samme emne:
Reize: http://www.eksperten.dk/artikler/1130
Og simpel upload: http://www.eksperten.dk/artikler/1098
Avatar billede dkfire Nybegynder
16. maj 2008 - 10:23 #2
Din $_FILES["image"]["tmp_name"] er IKKE en Image resource.
Du skal, ud fra hvilken type dit billede er, lave en image resource med funktionerne imagecreatefromgif, imagecreatefromjpeg eller imagecreatefrompng.
Avatar billede asn24 Nybegynder
16. maj 2008 - 16:02 #3
@ dkfire - Det virkede delvist.. Nu får jeg et sort billede. Jeg har prøvet at lave en fputs til at skrive informationerne til billedet, men det ser ikke ud til at virke.

Har du et forslag her også?
Avatar billede jakobdo Ekspert
16. maj 2008 - 18:29 #4
Hvad er der galt i at bruge mine 2 artikler?
De er gennemtestet og virker. :o)
Avatar billede dkfire Nybegynder
16. maj 2008 - 19:42 #5
Du tager også og ligger det forkerte billede ind i din database:
INSERT INTO .... `thumb` = '" . $thumb . "', ....
kan jo sætte et tomt billede ind.
Tror du skal bruge lade være med at bruge variabel navne flere forskellige gange.
Prøv at skrive din $image_type[1] ud for at se om den giver det rigtige til dine if sætninger.
Avatar billede asn24 Nybegynder
17. maj 2008 - 00:43 #6
jakobdo - Jeg har brugt lidt fra dine artikler, men dog ikke meget, da jeg står i en situation hvor jeg helst ikke vil gemme nogle filer på webserveren, men i stedet vil skrive det hele til databasen med det samme :) - og desuden virker resten af mit upload script jo udemærket, det er udelukkende resize jeg har problemer med :)

dkfire - Jeg har haft udskrevet samtlige variabler, og lige netop $image_type[1] skulle jo meget gerne være den samme hele vejen igennem scriptet da det thumbnail jeg vil generere skal være samme filformat som det uploadede billede er fra starten af :)
Avatar billede asn24 Nybegynder
17. maj 2008 - 00:44 #7
Det er muligt at se det i funktion her:

http://jordegern.dk.linux10.unoeuro.com
Avatar billede dkfire Nybegynder
17. maj 2008 - 01:11 #8
Så er spørgsmålet om hvordan du viser dit lille billede, samt om den går ind i den rigtige if sætning om laver et billede.
Avatar billede asn24 Nybegynder
17. maj 2008 - 01:18 #9
Jeg viser det lille billede på fuldstændig samme måde som jeg viser det store, så det ved jeg virker. - Poster lige den friske kode til jer :)

function upload_image() {
       
        if (isset($_POST["title"]) && $_FILES['image']['size'] > 0) {
            $file_name = $_FILES['image']['name'];
            $tmp_name  = $_FILES['image']['tmp_name'];
            $file_size = $_FILES['image']['size'];
            $file_type = $_FILES['image']['type'];
            $thumb_name = "thumb_" . $file_name;
           
            $fp      = fopen($tmp_name, 'r');
            $content = fread($fp, filesize($tmp_name));
            $content = addslashes($content);
            fclose($fp);   
               
            $image_type = explode("/", $file_type);   
           
            $image_dimensions = getimagesize($tmp_name);
            $width = $image_dimensions[0];
            $height = $image_dimensions[1];
           
               
            if ($file_size > 2097152) {
                echo "Billedet er større end 2 Mb, og kan derfor ikke uploades.";
            } elseif ($image_type[1] !== "jpeg" && $image_type[1] !== "png" && $image_type[1] !== "gif") {
                echo "Billedet er af typen " . $image_type[1] . ", og kan derfor ikke uploades. Formatet skal være JPEG, JPG, GIF eller PNG";
            } else {
           
               
                //Image resize
                //Target size in pixel                                               
                $target = 200; //px                                                       

                    if ($width > $height) {                                            
                    $percentage = ($target / $width);                                    
                    } else {                                                            
                    $percentage = ($target / $height);                                    
                    }                                                                    
                //gets the new value and applies the percentage, then rounds the value    
                    $thumb_width = round($width * $percentage);                        
                    $thumb_height = round($height * $percentage);                        
               
                //Create thumbnail
                switch($image_type[1])
                  {
                    case 'jpeg':
                    case 'jpe':
                    case 'jpg':
                      $srcim = imagecreatefromjpeg( $filename );
                      break;
                    case 'gif':
                      $srcim = imagecreatefromgif( $filename );
                      break;
                    case 'png':
                      $srcim = imagecreatefrompng( $filename );
                      break;
                    default:
                      return false;
                  }                                   
                $thumb = imagecreatetruecolor($thumb_width, $thumb_height);
                $fput_data = @imagecopyresampled ($thumb, $srcim, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height);
                //imagecopyresampled(resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)
               
                switch($image_type[1])
                {
                  case 'jpeg':
                  case 'jpe':
                  case 'jpg':
                    imagejpeg( $thumb, $thumb_name, 100 );
                    break;
                  case 'gif':
                    imagegif( $thumb, $thumb_name );
                    break;
                  case 'png':
                    $png_q = floor( abs( 100 / 10 - 9.9 ) );
                    imagepng( $thumb, $thumb_name, $png_q );
                      break;
                  default:
                    return false;
                }
               
                $fp      = fopen($thumb_name, 'a+');
                $fput     = fwrite($fp, $fput_data);
                $thumb     = fread($fp, filesize($thumb_name));
                $thumb     = addslashes($thumb);
                fclose($fp);               
               
                //echo "Content: " . $content;
                //echo "<br />Thumb: " . $thumb . "<br />";
                   
                $image_sql = "INSERT INTO `" . _MYSQL_GALLERY . "` SET `thumb_width` = '" . $thumb_width . "', `thumb_height` = '" . $thumb_height . "', `thumb` = '" . $thumb . "', `width` = '" . $width . "', `height` = '" . $height . "', `image` = '" . $content . "', `title` = '" . mysql_real_escape_string($_POST["title"]) . "', `description` = '" . mysql_real_escape_string($_POST["description"]) . "', `user_id` = '1', `type` = '" . $file_type . "'";
                $image_query = mysql_query($image_sql) or die(mysql_error());
               
                    echo "Billede successfuldt uploadet.<br /><br /><a href=\"?show=all\">Galleriforside</a><br /><a href=\"?user=1\">Dit galleri</a><br />";
               
            }
        }
}
?>
Avatar billede asn24 Nybegynder
18. maj 2008 - 22:56 #10
Ingen der har noget?
Avatar billede dkfire Nybegynder
19. maj 2008 - 14:43 #11
Hvad giver den af fejl ??
Hvad sker der hvis du fjerner @ ved @imagecopyresampled() ?

Indeholder thumb i databasen noget data ??

Jeg kunne godt tænke mig at se hvordan du har lavet show_thumb.php.

Men der er en stor fejl du laver i den kode:
$fp      = fopen($thumb_name, 'a+');
                $fput    = fwrite($fp, $fput_data);
                $thumb    = fread($fp, filesize($thumb_name));
                $thumb    = addslashes($thumb);
                fclose($fp); 

Først åbner du en fil du allerede har lavet med imagejpeg, imagegif eller imagepng.
Dernæst forsøøger du at ligge ukomprimeret billeddata ned i filen.
Derefter læser du den samme data og tilføjer addslashes.
Det giver slet ingen mening at bruge ukompromeret billeddata, det kan du jo ikke bruge til at vise billeder med.
Du skal istedet bruge imagejpeg, imagegif eller imagepng til at lave den billeddata som du vil ligge i databasen.
Avatar billede asn24 Nybegynder
19. maj 2008 - 16:59 #12
Hvis jeg fjerner @ giver den denne fejl:

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /var/www/jordegern.dk/public_html/inc/functions.php on line 119, som jo egentlig nok er roden til alt ondt i mit tilfælde..

linie 119 ser således ud:

imagecopyresampled ($thumb, $srcim, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height);


show_thumb.php ser således ud:

<?php
    require_once("inc/config.php");
    $sql = "SELECT `thumb`,`type` FROM `" . _MYSQL_GALLERY . "` WHERE `id` = '" . $_GET["id"] . "'";
    $do = mysql_query($sql);       
        if(mysql_num_rows($do) == 1) {
        $img = mysql_fetch_assoc($do);   
        $type = $img['type'];
        $data = $img['thumb'];       
        header("Content-type: $type");
        echo $data;
    } else {
        echo "Filen findes ikke!";
    }
?>

Jeg har nu fjernet den store fejl du påpegede - Smed det egentlig ind fordi jeg vidste det virkede længere oppe i mit script, men der er det selvfølgelig heller ikke rå billeddata.
Avatar billede asn24 Nybegynder
19. maj 2008 - 17:01 #13
Efter jeg har lavet de tilretninger du sagde jeg skulle lave, laver den ikke længere et thumbnail overhovedet..
Avatar billede dkfire Nybegynder
19. maj 2008 - 17:11 #14
Lige en hurtig rettelse:

Din variabel hedder ikke $filename men $file_name
Ret:
switch($image_type[1])
                  {
                    case 'jpeg':
                    case 'jpe':
                    case 'jpg':
                      $srcim = imagecreatefromjpeg( $filename );
                      break;
                    case 'gif':
                      $srcim = imagecreatefromgif( $filename );
                      break;
                    case 'png':
                      $srcim = imagecreatefrompng( $filename );
                      break;
                    default:
                      return false;
                  }
Til:
switch($image_type[1])
                  {
                    case 'jpeg':
                    case 'jpe':
                    case 'jpg':
                      $srcim = imagecreatefromjpeg( $file_name );
                      break;
                    case 'gif':
                      $srcim = imagecreatefromgif( $file_name );
                      break;
                    case 'png':
                      $srcim = imagecreatefrompng( $file_name );
                      break;
                    default:
                      return false;
                  }

Udover det, har du så husket at ligge resultatet af imagejpeg og de andre i en variabel, i stedet for en fil ??
Avatar billede asn24 Nybegynder
19. maj 2008 - 17:23 #15
Rettet ;)

Ja, den ligger i en variabel der hedder $final_thumb :)

Efter jeg har rettet dette til giver den lidt flere fejl:

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: Unable to access 2008_01_24_cat_not_drunk.jpg in /var/www/jordegern.dk/public_html/inc/functions.php on line 107

Warning: imagecreatefromjpeg(2008_01_24_cat_not_drunk.jpg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /var/www/jordegern.dk/public_html/inc/functions.php on line 107

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /var/www/jordegern.dk/public_html/inc/functions.php on line 119


Linie 107 og omliggende:

switch($image_type[1])
                  {
                    case 'jpeg':
                    case 'jpe':
                    case 'jpg':
                      $srcim = imagecreatefromjpeg( $file_name ); // LINE 107
                      break;
                    case 'gif':
                      $srcim = imagecreatefromgif( $file_name );
                      break;
                    case 'png':
                      $srcim = imagecreatefrompng( $file_name );
                      break;
                    default:
                      return false;
                  }
Avatar billede dkfire Nybegynder
19. maj 2008 - 18:05 #16
Ja se det skyldes så at den ikke kan finde filen med navnet fra $file_name.
Men tror du ikke også at du skal bruge $tmp_name i stedet for $file_name.
Avatar billede asn24 Nybegynder
19. maj 2008 - 18:26 #17
Så giver den ikke fejl længere.. Til gengæld virker det stadig ikke med thumbnailsne.. (Lidt pinligt jeg ikke selv opdagede min variabelfejl :/ )
Avatar billede asn24 Nybegynder
19. maj 2008 - 18:35 #18
Så fik jeg det til at virke. Jeg opdagede at den alligevel smed en fil på webserveren, så jeg lavede en fopen på den, læste indholdet, og smed det ind i databasen på den måde, og sletter det så igen med unlink bagefter :)

Smid et svar og du skal få points :)
Avatar billede asn24 Nybegynder
19. maj 2008 - 18:40 #19
og tusind tak for hjælpen forresten :)

Scriptet endte med at se sådan ud:

    function upload_image() {
       
        if (isset($_POST["title"]) && $_FILES['image']['size'] > 0) {
            $file_name = $_FILES['image']['name'];
            $tmp_name  = $_FILES['image']['tmp_name'];
            $file_size = $_FILES['image']['size'];
            $file_type = $_FILES['image']['type'];
            $thumb_name = "thumb_" . $file_name;
           
            $fp      = fopen($tmp_name, 'r');
            $content = fread($fp, filesize($tmp_name));
            $content = addslashes($content);
            fclose($fp);   
               
            $image_type = explode("/", $file_type);   
           
            $image_dimensions = getimagesize($tmp_name);
            $width = $image_dimensions[0];
            $height = $image_dimensions[1];
           
               
            if ($file_size > 2097152) {
                echo "Billedet er større end 2 Mb, og kan derfor ikke uploades.";
            } elseif ($image_type[1] !== "jpeg" && $image_type[1] !== "png" && $image_type[1] !== "gif") {
                echo "Billedet er af typen " . $image_type[1] . ", og kan derfor ikke uploades. Formatet skal være JPEG, JPG, GIF eller PNG";
            } else {
           
               
                //Image resize
                //Target size in pixel                                               
                $target = 200; //px                                                       

                    if ($width > $height) {                                            
                    $percentage = ($target / $width);                                    
                    } else {                                                            
                    $percentage = ($target / $height);                                    
                    }                                                                    
                //gets the new value and applies the percentage, then rounds the value    
                    $thumb_width = round($width * $percentage);                        
                    $thumb_height = round($height * $percentage);                        
               
                //Create thumbnail
                switch($image_type[1])
                  {
                    case 'jpeg':
                    case 'jpe':
                    case 'jpg':
                      $srcim = imagecreatefromjpeg( $tmp_name );
                      break;
                    case 'gif':
                      $srcim = imagecreatefromgif( $tmp_name );
                      break;
                    case 'png':
                      $srcim = imagecreatefrompng( $tmp_name );
                      break;
                    default:
                      return false;
                  }                                   
                $thumb = imagecreatetruecolor($thumb_width, $thumb_height);
                imagecopyresampled ($thumb, $srcim, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height);
                //imagecopyresampled(resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)
               
                switch($image_type[1])
                {
                  case 'jpeg':
                  case 'jpe':
                  case 'jpg':
                    imagejpeg( $thumb, $thumb_name, 100 );
                    break;
                  case 'gif':
                    imagegif( $thumb, $thumb_name );
                    break;
                  case 'png':
                    $png_q = floor( abs( 100 / 10 - 9.9 ) );
                    imagepng( $thumb, $thumb_name, $png_q );
                      break;
                  default:
                    return false;
                }
               
                $fp2      = fopen($thumb_name, 'r');
                $thumb = fread($fp2, filesize($thumb_name));
                $thumb = addslashes($thumb);
                fclose($fp2);
               
                unlink($thumb_name);
               
                //echo "Content: " . $content;
                //echo "<br />Thumb: " . $thumb . "<br />";
                   
                $image_sql = "INSERT INTO `" . _MYSQL_GALLERY . "` SET `thumb_width` = '" . $thumb_width . "', `thumb_height` = '" . $thumb_height . "', `thumb` = '" . $thumb . "', `width` = '" . $width . "', `height` = '" . $height . "', `image` = '" . $content . "', `title` = '" . mysql_real_escape_string($_POST["title"]) . "', `description` = '" . mysql_real_escape_string($_POST["description"]) . "', `user_id` = '1', `type` = '" . $file_type . "'";
                $image_query = mysql_query($image_sql) or die(mysql_error());
               
                    echo "Billede successfuldt uploadet.<br /><br /><a href=\"?show=all\">Galleriforside</a><br /><a href=\"?user=1\">Dit galleri</a><br />";
               
            }
        }
}
Avatar billede dkfire Nybegynder
19. maj 2008 - 19:05 #20
Jamen jeg ligger et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester