Avatar billede frustrator Nybegynder
18. februar 2010 - 13:16 Der er 25 kommentarer

Resize med GDlib?

Howdy.

Er der en ørn herinde som ved, hvordan man hurtigt og simpelt skruer et script sammnen, som via GDlib kan resize et billede? Funktionen skal være således:

Har en mappe med jpg-billeder, der f.eks. er 180x260. Jeg vil gerne hive et billede ud fra mappen og vise det på siden i en størrelse på f.eks. 100x145. At resize billeder via ren html er gammeldags og også spild af datatransfer, så jeg har hørt at GDlib lige er sagen. Det resizede billede skal vises på siden, men IKKE gemmes sidenhen, så her kommer ImageDestroy vel ind i billedet, eller...?

Jeg har intet begreb om GDlib, men har læst en smule om det. Men hvordan skruer jeg sådan et script sammen? Og hvilke funktioner skal bruges? Er det f.eks. ImageCreateFrom, ImageCopyResized oder wie? Nogen, der hurtigt kan vise, hvordan sådan et script skal være?

Min side ligger på en server med PHP 4.4.8 og GDlib 2.0.28.
Avatar billede michael_stim Ekspert
18. februar 2010 - 13:50 #1
jakobdo har skrevet et par artikler om det ;o)
http://www.eksperten.dk/guide/1130
Avatar billede frustrator Nybegynder
18. februar 2010 - 14:00 #2
Nydeligt... tror jeg nok, at bedømme ud fra kommentarene :o)

Men som sagt har jeg absolut intet kendskab til gdlib og alt det andet, så jeg har lidt brug for at få skåret ud i vådt pap med en motorsav præcis hvor jeg referer til originalbilledet/mappen osv. Går ud fra at det er i forbindelse med $filename?
Avatar billede majbom Novice
18. februar 2010 - 19:42 #3
resize('org/filnavn.jpg', 'stien/til/nyt_filnavn.jpg', 300, 300);
Avatar billede frustrator Nybegynder
18. februar 2010 - 20:19 #4
Okay, super... thanx :o)

Jeg får imidlertid denne fejlmeddelelse:

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in gdtest.php on line 23

Linje 23 ser således ud:

function resize( 'gfx/images/posters/enemy_mine.jpg', 'gfx/images/gdlib/enemy_mine.jpg', 100, 145, $quality=85 ){  $ext = strtolower(

Så der mangler åbenbart en ) eller hvordan?
Avatar billede majbom Novice
18. februar 2010 - 20:25 #5
du skal jo ikke ændre på det funktion du henter herfra, du skal kalde den med:

resize('gfx/images/posters/enemy_mine.jpg', 'gfx/images/gdlib/enemy_mine.jpg', 100, 145);
Avatar billede frustrator Nybegynder
18. februar 2010 - 20:46 #6
Øh, how so? Ja, beklager, men det er første gang jeg stifter bekendtskab med dette, så er ret blank :o/ Netop nu ser det komplette script således ud:

<?
function resize('gfx/images/posters/enemy_mine.jpg', 'gfx/images/gdlib/enemy_mine.jpg', 100, 145, $quality=85)
{
  $ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
  switch($ext)
  {
    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;
  }
  $ow = imagesx( $srcim );
  $oh = imagesy( $srcim );
  $wscale = $maxw / $ow;
  $hscale = $maxh / $oh;
  $scale = min( $hscale, $wscale );
  $nw = round( $ow * $scale, 0 );
  $nh = round( $oh * $scale, 0 );
  $dstim = imagecreatetruecolor( $nw, $nh );
  imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
  switch($ext)
  {
    case 'jpeg':
    case 'jpe':
    case 'jpg':
      imagejpeg( $dstim, $newfilename, $quality );
      break;
    case 'gif':
      imagegif( $dstim, $newfilename );
      break;
    case 'png':
      $png_q = floor( abs( $quality / 10 - 9.9 ) );
      imagepng( $dstim, $newfilename, $png_q );
      break;
      default:
      return false;
  }
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return file_exists($newfilename);}
?>

Hvilket giver følgende fejl:

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in /home/virtual/ultimative-80ere.dk/public_html/site/gdtest.php on line 23

Og linje 23 er så:

function resize('gfx/images/posters/enemy_mine.jpg', 'gfx/images/gdlib/enemy_mine.jpg', 100, 145, $quality=85)
Avatar billede michael_stim Ekspert
18. februar 2010 - 20:57 #7
Du lægger koden i en fil, som f eks kunne hedde funktioner.php. Der du uploader inkluderer du filen med require, require_once, include eller include_once. Derefter kalder du på funktionen og inkluderer de parametrer der skal med.
Avatar billede majbom Novice
18. februar 2010 - 20:57 #8

//funktionen erklæres sådan:

function resize( $filename, $newfilename, $maxw, $maxh, $quality=85 )
{
  $ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
  switch($ext)
  {
    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;
  }
  $ow = imagesx( $srcim );
  $oh = imagesy( $srcim );
  $wscale = $maxw / $ow;
  $hscale = $maxh / $oh;
  $scale = min( $hscale, $wscale );
  $nw = round( $ow * $scale, 0 );
  $nh = round( $oh * $scale, 0 );
  $dstim = imagecreatetruecolor( $nw, $nh );
  imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
  switch($ext)
  {
    case 'jpeg':
    case 'jpe':
    case 'jpg':
      imagejpeg( $dstim, $newfilename, $quality );
      break;
    case 'gif':
      imagegif( $dstim, $newfilename );
      break;
    case 'png':
      $png_q = floor( abs( $quality / 10 - 9.9 ) );
      imagepng( $dstim, $newfilename, $png_q );
      break;
    default:
      return false;
  }
  imagedestroy( $dstim );
  imagedestroy( $srcim );
  return file_exists($newfilename);
}


//....og kaldes sådan:

resize('gfx/images/posters/enemy_mine.jpg', 'gfx/images/gdlib/enemy_mine.jpg', 100, 145);
Avatar billede michael_stim Ekspert
18. februar 2010 - 20:59 #9
Hvis du intet kan om php, vil jeg anbefale at læse lidt om det. Der er masser af tutorials på nettet. Kan du intet om php, kan dette blive en MEGET lang fødsel.
Avatar billede frustrator Nybegynder
18. februar 2010 - 21:07 #10
Mit kendskab til PHP er på begynderniveau, så ja... det kunne godt være at det ville være en lang og sej fødsel. Jeg har ledt længe efter gode begynder-tutorials til gdlib, men synes der er langt imellem dem (ja, ved godt at vi snakker to ting her - gdlib og PHP generelt).

Well, tilbage til bøgerne. Skidtet virker ikke endnu, men smid et svar en af jer, så jeg kan komme af med nogle point...
Avatar billede majbom Novice
18. februar 2010 - 21:17 #11
det burde virke med mit eksempel, hvilken fejl får du?

og i stedet for at gå igang med gdlib, ville jeg nok overveje at få lidt kendskab til variabler, arrays, function, switches og andre ting som er ret vigtige for din videre udvikling ifm php

du kan evt. starte her:

www.phpartikler.dk
www.tizag.com
Avatar billede frustrator Nybegynder
18. februar 2010 - 21:29 #12
Splazz: Hvis jeg nu prøver at smide hele molevitten i ét og samme dokument, så ser det således ud:

<?
function resizeresize( $filename, $newfilename, $maxw, $maxh, $quality=85 )
{
  $ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
  switch($ext)
  {
    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;
  }
  $ow = imagesx( $srcim );
  $oh = imagesy( $srcim );
  $wscale = $maxw / $ow;
  $hscale = $maxh / $oh;
  $scale = min( $hscale, $wscale );
  $nw = round( $ow * $scale, 0 );
  $nh = round( $oh * $scale, 0 );
  $dstim = imagecreatetruecolor( $nw, $nh );
  imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
  switch($ext)
  {
    case 'jpeg':
    case 'jpe':
    case 'jpg':
      imagejpeg( $dstim, $newfilename, $quality );
      break;
    case 'gif':
      imagegif( $dstim, $newfilename );
      break;
    case 'png':
      $png_q = floor( abs( $quality / 10 - 9.9 ) );
      imagepng( $dstim, $newfilename, $png_q );
      break;
      default:
      return false;
  }
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return file_exists($newfilename);}
?>
<?
resize('gfx/images/posters/enemy_mine.jpg', 'gfx/images/gdlib/enemy_mine.jpg', 100, 145);
?>

Nu vises siden fint, dog uden billede og med denne fejl:

Fatal error: Call to undefined function: resize() in /home/virtual/ultimative-80ere.dk/public_html/site/gdtest.php on line 74


Linje 74 er:

resize('gfx/images/posters/enemy_mine.jpg', 'gfx/images/gdlib/enemy_mine.jpg', 100, 145);

Jeg er klar over at jeg også skal have printet billedet, men Michael har vist ret - jeg må vist hellere gå back to basics og starte helt forfra med lærdommen.
Avatar billede majbom Novice
18. februar 2010 - 21:43 #13
du kalder funktionen resizeresize men kalder en funktion der hedder resize som den naturligvis ikke kan finde da du kan har en der hedder resizeresize ;)
Avatar billede frustrator Nybegynder
18. februar 2010 - 21:53 #14
I know - det var en lille fejl, som jeg i det mindste selv fandt ;o)
Avatar billede majbom Novice
19. februar 2010 - 01:52 #15
super, så virker det nu?
Avatar billede frustrator Nybegynder
19. februar 2010 - 10:18 #16
Well, ja... sådan da :o) Billedet bliver resizet og gemt i den angivne mappe, men det skulle nødig gemmes permanent, da mappen så hurtigt vil blive fyldt op.

Og så kæmper jeg lidt med at få udskrevet billedet til browseren :o/
Avatar billede majbom Novice
19. februar 2010 - 10:37 #17
du kan også bruge jakobs klasse: http://www.eksperten.dk/guide/1201

<?php
require_once('class.image.php');

try{
    $image = new image('image.jpg');
    $image->resize(100,100,true);
    $image->show('jpg');
}catch(Exception $e){
    echo 'Exception Caught : <b >' . $e->getMessage() . '[/b]';
}

?>


så gemmer den ikke billedet, men udskriver det blot
Avatar billede frustrator Nybegynder
19. februar 2010 - 13:29 #18
Splazz... Jeg er ikke et sekund i tvivl om at Michael har ret mht. til mine manglende PHP-kundskaber. Jeg er absolut heller ikke i tvivl om, at Jakob har skrevet nogle fantastiske artikler. Endelig er jeg heller ikke i tvivl om, at din tålmodighed er blevet sat på prøve med mine spørgsmål.

Jeg er imidlertid faldet over et ekstremt simpelt script, som bare virker 100%, og jeg vil gerne dele dele det med jer:

Filen imgsize.php:

<?php
header ("Content-type: image/jpeg");
/*
JPEG / PNG Image Resizer
Parameters (passed via URL):

img = path / url of jpeg or png image file

percent = if this is defined, image is resized by it's
          value in percent (i.e. 50 to divide by 50 percent)

w = image width

h = image height

constrain = if this is parameter is passed and w and h are set
            to a size value then the size of the resulting image
            is constrained by whichever dimension is smaller

Requires the PHP GD Extension

Outputs the resulting image in JPEG Format

By: Michael John G. Lopez - www.sydel.net
Filename : imgsize.php
*/

$img = $_GET['img'];
$percent = $_GET['percent'];
$constrain = $_GET['constrain'];
$w = $_GET['w'];
$h = $_GET['h'];

// get image size of img
$x = @getimagesize($img);
// image width
$sw = $x[0];
// image height
$sh = $x[1];

if ($percent > 0) {
    // calculate resized height and width if percent is defined
    $percent = $percent * 0.01;
    $w = $sw * $percent;
    $h = $sh * $percent;
} else {
    if (isset ($w) AND !isset ($h)) {
        // autocompute height if only width is set
        $h = (100 / ($sw / $w)) * .01;
        $h = @round ($sh * $h);
    } elseif (isset ($h) AND !isset ($w)) {
        // autocompute width if only height is set
        $w = (100 / ($sh / $h)) * .01;
        $w = @round ($sw * $w);
    } elseif (isset ($h) AND isset ($w) AND isset ($constrain)) {
        // get the smaller resulting image dimension if both height
        // and width are set and $constrain is also set
        $hx = (100 / ($sw / $w)) * .01;
        $hx = @round ($sh * $hx);

        $wx = (100 / ($sh / $h)) * .01;
        $wx = @round ($sw * $wx);

        if ($hx < $h) {
            $h = (100 / ($sw / $w)) * .01;
            $h = @round ($sh * $h);
        } else {
            $w = (100 / ($sh / $h)) * .01;
            $w = @round ($sw * $w);
        }
    }
}

$im = @ImageCreateFromJPEG ($img) or // Read JPEG Image
$im = @ImageCreateFromPNG ($img) or // or PNG Image
$im = @ImageCreateFromGIF ($img) or // or GIF Image
$im = false; // If image is not JPEG, PNG, or GIF

if (!$im) {
    // We get errors from PHP's ImageCreate functions...
    // So let's echo back the contents of the actual image.
    readfile ($img);
} else {
    // Create the resized image destination
    $thumb = @ImageCreateTrueColor ($w, $h);
    // Copy from image source, resize it, and paste to image destination
    @ImageCopyResampled ($thumb, $im, 0, 0, 0, 0, $w, $h, $sw, $sh);
    // Output resized image
    @ImageJPEG ($thumb);
}
?>


Denne kaldes så ganske enkelt med:

<img src='imgsize.php?percent=50&img=gfx/images/posters/bat21.jpg' />

Se, DET synes jeg da er simpelt, er det ikke? Scriptet fandt jeg her: http://tech.mikelopez.info/2006/03/02/php-image-resize-script/

Send et svar, Splazz, så du kan få point for din tålmodighed :o)
Avatar billede michael_stim Ekspert
19. februar 2010 - 13:42 #19
Syndes nu ikke vores tålmodighed har været sat på prøve. Der er mange herinde der ikke:

kender sine begrænsninger
læser hvad der bliver skrevet
er høflige
takker for hjælpen
kan tage mod konstruktiv kritik
osv osv.

Og det er ikke for at lyde som en sur gammel mand, men mere for at give dig ros ;o)
Avatar billede frustrator Nybegynder
19. februar 2010 - 13:49 #20
Michael... well, øh... tak, tror jeg nok ;o)

Har da lært at jeg skal gå back to basics og starte lidt forfra med det hele, måske man skulle få fat i nogle Dummies-bøger ;o) Anyways, jeg er meget taknemmelig for jeres tålmodighed og tips/råd/vejledninger og må erkende, at jeg vist er i en langt lavere liga en jer andre.

Keep up the good work - og hvem skal så have pointene?
Avatar billede majbom Novice
19. februar 2010 - 16:25 #21
super du selv har fundet en løsning, så fortjener du næsten pointsene selv :)

du styrer selv hvad der skal ske med de point...
Avatar billede frustrator Nybegynder
19. februar 2010 - 20:06 #22
En af jer, smid et svar :o)
Avatar billede michael_stim Ekspert
19. februar 2010 - 21:02 #23
Samler ikke på point. ellers tak.
Avatar billede majbom Novice
19. februar 2010 - 21:28 #24
behold du dem bare selv :)
Avatar billede majbom Novice
04. november 2010 - 13:22 #25
frustrator?
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