Avatar billede htx98i17 Professor
14. februar 2006 - 21:26 Der er 7 kommentarer og
2 løsninger

gd resize billede

Jeg har fundet følgende kode og funktion:

function imageresizejpeg($sourcefile,$maxwidth,$maxheight,$destinationfile=false) {
    if($img_src = imagecreatefromjpeg($sourcefile)) {
        copy($sourcefile, $destinationfile);
        $info=getimagesize($sourcefile);
        if($info[1]>$maxheight || $info[0]>$maxwidth) {
            $ratio_height=$maxheight/$info[1];
            $ratio_width=$maxwidth/$info[0];
            $ratio=min($ratio_width,$ratio_height);
            $newwidth=intval($info[0]*$ratio);
            $newheight=intval($info[1]*$ratio);
            $img_dst=imagecreatetruecolor($newwidth,$newheight);
            imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $newwidth, $newheight, $info[0], $info[1]);
            imagejpeg($img_dst, $destinationfile);
            imagedestroy($img_dst);
        // echo "Billede gemmes som $destinationfile i størrelse $newwidth x $newheight.<BR>";
        }
        imagedestroy($img_src);
        return true;
    } else {
        return false;
    }
}

$hent = mysql_query("SELECT billede FROM tblbilleder WHERE id = '1' ") or die(mysql_error());
    $billede2 = mysql_fetch_array($hent);
    header("Content-type: image/jpeg");
   
   
    imageresizejpeg($billede2['billede'],100,100,$file2);
   
    echo$file2;
    //echo$billede2['billede'];

Hvis jeg echoer $billede2['billede'] så viser den det kilde-billedet. Så den henter fint billede fra databasen.

Men hvis jeg kører funktionen (og echoer $file2) så kommer følgende fejl:
imagecreatefromjpeg(ÿØÿà): failed to open stream: No such file or directory in <b>/upload.php</b> on line <b>15

Hvorfor vil funktionen ikke bruge billedet hentet fra databasen?
Avatar billede gartneriet Nybegynder
14. februar 2006 - 21:43 #1
imagecreatefromjpeg skal bruge et filnavn.
Fejlen imagecreatefromjpeg(ÿØÿà) - her burde stå et filnavn. I stedet står der ÿØÿà - jpegfiler starter netop med disse 4 tegn så jeg tror du gemmer selve billedet i din mysql-tabel (i feltet billede i tabellen tblbilleder) i stedet for filnavnet.
Avatar billede htx98i17 Professor
14. februar 2006 - 21:47 #2
Jeg har gemt billedet i mysql. Ja.
Og jeg kan få vist det billede fra mysql ved blot at echo$billede2['billede']

Jeg vil uden om at gemme billedet på harddisken efter at jeg har hentet filen fra mysql.

Derfor bruger jeg $billede2['billede'] som sourcefile i funktionen, for det er det billede som skal laves mindre.
Avatar billede htx98i17 Professor
14. februar 2006 - 21:53 #3
Jeg har funktionen herfra:
http://www.eksperten.dk/spm/454632
Avatar billede gartneriet Nybegynder
14. februar 2006 - 22:13 #4
Du bruger Internet Explorer gætter jeg på .... den viser nemlig et billede selv om der ikke er sendt de rigtige headers. Derfor for du vist et billede når du echo'er billedet som er gemt i mysql.

Det er fint nok at gemme billeddata direkte.
Problemet er bare at imagecreatefromjpeg() som din imageresizejpeg()-funktion bruger til at åbne billedet med, kun kan åbne en fil fra filsystemet. Den kan ikke bruge de rå billeddata.

Men hvis du i skifter
imagecreatefromjpeg($sourcefile)

ud med
imagecreatefromstring($sourcefile) så virker det.

Eller ... der kommer så fejl i linien nedenunder, igen fordi $sourcefile ikke er en fil i filsystemet. copy($sourcefile, $destfile) forsøger jo at oprette en kopi af filen. Men $sourcefile er stadig ikke en fil men billeddata.

Og så kan man selvfølgelig kode sig uden om det også. Men selv om man gør det, så vil den resize-de fil blive gemt som en fil - og så vidt jeg kan forstå er det det du helst vil undgå?
Avatar billede htx98i17 Professor
14. februar 2006 - 22:15 #5
ja den resizede skal ikke gemmes.

men behøves linjen copy(...) egentlig være der?
Avatar billede htx98i17 Professor
14. februar 2006 - 22:18 #6
den resizede skal blot echo'es
Avatar billede gartneriet Nybegynder
14. februar 2006 - 22:23 #7
Nå, skidt jeg har alligevel ikke bedre ting at foretage mig i dag :-)

Jeg har - vist nok - fikset funktionen så den fungerer til dit formål:

imageresizejpeg($sourcefile,$maxwidth,$maxheight) {
    if($img_src = imagecreatefromstring($sourcefile)) {
        $width = imagesx($img_src);
    $height = imagesy($img_src);
    if($height > $maxheight || $width > $maxwidth) {
            $ratio_height=$maxheight/$height;
            $ratio_width=$maxwidth/$width;
            $ratio=min($ratio_width,$ratio_height);
            $newwidth=intval($width*$ratio);
            $newheight=intval($height*$ratio);
            $img_dst=imagecreatetruecolor($newwidth,$newheight);
            imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
            imagejpeg($img_dst);
            imagedestroy($img_dst);
        // echo "Billede gemmes som $destinationfile i størrelse $newwidth x $newheight.<BR>";
        }
        imagedestroy($img_src);
        return true;
    } else {
        return false;
    }
}


Jeg har dog ikke testet den.
Den originale version skulle også bruge en fil for at finde bredde/højde på billedet. Den modificerede version her henter disse ud fra gd-billedet som bliver lavet af imagecreatefromstring(),

Og så bliver billedet ikke gemt mere og derfor er $destionationfile også fjernet fra funktionens parameterliste.
Avatar billede htx98i17 Professor
14. februar 2006 - 22:31 #8
takker
det fungerede fint med ét af mine jpeg billeder, men ikke med et alm digital foto,
den meldte følgende fejl: Passed data is not in 'JPEG' format in

men jeg vil lige kigge videre på det imorgen. mange tak for hjælpen indtil videre.
Avatar billede htx98i17 Professor
14. februar 2006 - 22:35 #9
og nu fandt jeg lige ud af hvorfor :) mit felt skulle være longblob i stedet for blob, for ellers var der ikke plads nok til at have hele jpeg billedet 'billede'

tak for hjælpen, du skal have point...
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