login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Kwaliteit na resize, even logica snappen (Opgelost)

Offline JeroenI - 11/03/2014 22:28 (laatste wijziging 11/03/2014 22:48)
Avatar van JeroenIPHP interesse Goedenavond,

Doormiddel van "imagejpeg($tn, $save,100);" wordt het bestand weggeschreven als TN. Ik neem aan dat 100 staat voor de kwaliteit? Waarom is de kwaliteit dan nog zo slecht van een thumbnail na uploaden? Kan dit komen omdat hij van heel groot naar betrekkelijk klein moet verkleinen?

Alvast mijn dank.

Klein deeltje code, misschien zien jullie in een oogopslag waar de resize mis gaat...

  1. $file = ''.$pad.''.$album.'-'.$subalbum.'-'.$imagename.'';
  2. $save = ''.$pad.'thmb/'.$imagename.'';
  3.  
  4. list($width, $height) = getimagesize($target);
  5.  
  6. $modheight = 100;
  7. $diff = $height / $modheight;
  8. $modwidth = $width / $diff;
  9.  
  10. $tn = imagecreatetruecolor($modwidth, $modheight) ;
  11. $image = imagecreatefromjpeg($file) ;
  12. imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, ImageSX($image), ImageSY($image)) ;
  13.  
  14. imagejpeg($tn, $save,100);

7 antwoorden

Gesponsorde links
Offline vinTage - 11/03/2014 23:05
Avatar van vinTage Nieuw lid Op het eerste gezicht ziet je code er normaal uit, behalve dat je waar je ImageSX(..) en ImageSY(..) gebruikt, daar de waardes van de orginele image moet gebruiken.

Ik weet uit mijn hoofd niet wat die list teruggeeft, dus misschien is het wel goed wat je daar gebruikt, maar ik zou die waardes ter controle toch even dumpen.
Bedankt door: JeroenI
Offline JeroenI - 11/03/2014 23:09 (laatste wijziging 11/03/2014 23:20)
Avatar van JeroenI PHP interesse Bedankt voor je reactie. Ik had eerst ipv ImageSX... en SY... $width en $height gebruikt, uitgelezen waardes uit het orgineel. Dit gaf hetzelfde resultaat. google kwam met het idee voor ImageSX en SY... maar helaas..

[edit]
en $target is gewoon de orginele afbeelding

[edit2]
$target inmiddels gewijzigd naar $file, zag dat hij er onnodig dubbel stond

deze ook gewijzigd
  1. imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, ImageSX($image), ImageSY($image));


naar

  1. imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);


$width en $height geven gewoon de correcte waardes
Offline Thomas - 11/03/2014 23:39
Avatar van Thomas Moderator Bovenstaande thumb is volgens mij wel volgens de regels der (thumbcreatie) kunst gemaakt, behalve $modWidth, dit is waarschijnlijk een float. Misschien gooit dit roet in het eten? Probeer deze eens te typecasten naar int, of af te ronden met round().
Offline JeroenI - 12/03/2014 00:26
Avatar van JeroenI PHP interesse Zou je je nader willen verklaren of een voorbeeld kunnen geven? Waarom zou dit roet in het eten kunnen gooien? De afmetingen kloppen namelijk gewoon wel.
Offline marten - 12/03/2014 08:44
Avatar van marten Beheerder Waar ik zelf altijd voorstander van ben is het gebruik van PHP.net: bcdiv en PHP.net: bcmul En dan afronden op 5 cijfers achter de komma.

Verder kan je sterke verbeteringen verwachten bij het gebruik van bijvoorbeeld http://www.imagemagick.org/
Offline Thomas - 12/03/2014 10:19 (laatste wijziging 12/03/2014 11:08)
Avatar van Thomas Moderator
marten schreef:
Waar ik zelf altijd voorstander van ben is het gebruik van PHP.net: bcdiv en PHP.net: bcmul En dan afronden op 5 cijfers achter de komma.


Overkill much? Daarnaast verwacht imagecreatetruecolor integers, waar het mij eigenlijk om begonnen was.

EDIT: Het onderstaande test-script doet precies hetzelfde, de kwaliteit van de gegenereerde thumbnails lijkt gewoon goed? Het enige verschil is dus regel 30 (afgeronde breedte).

  1. <?php
  2. function dump($a) {
  3. echo '<pre>'.print_r($a, true).'</pre>';
  4. }
  5.  
  6. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  7. // Sanity checks.
  8. $errors = array();
  9. if ($_FILES['file']['error'][0] > 0) {
  10. $errors[] = 'upload error '.$_FILES['file']['error'][0];
  11. }
  12. $extension = array_pop(explode('.', $_FILES['file']['name'][0]));
  13. if (!in_array($extension, array('jpg'))) {
  14. $errors[] = 'unsupported file type';
  15. }
  16. if (($dimensions = @getimagesize($_FILES['file']['tmp_name'][0])) === false) {
  17. $errors[] = 'could not determine image dimensions';
  18. }
  19. if (count($errors)) {
  20. dump($errors);
  21. dump($_POST);
  22. dump($_FILES);
  23. }
  24.  
  25. // Image calculations.
  26. list($width, $height) = $dimensions;
  27. $resizedHeight = 100;
  28. $ratio = $height / $resizedHeight;
  29. $resizedWidth = round($width / $ratio);
  30.  
  31. // Image creation.
  32. $imageSource = imagecreatefromjpeg($_FILES['file']['tmp_name'][0]);
  33. $imageDestination = imagecreatetruecolor($resizedWidth, $resizedHeight);
  34. imagecopyresampled($imageDestination, $imageSource, 0, 0, 0, 0, $resizedWidth, $resizedHeight, $width, $height);
  35. imagedestroy($imageSource); // memory cleanup
  36.  
  37. // Send image to output.
  38. header('Content-Type: image/jpeg');
  39. imagejpeg($imageDestination, null, 100);
  40.  
  41. imagedestroy($imageDestination); // memory cleanup
  42. } else {
  43. header('Content-Type: text/html; charset=UTF-8');
  44. ?>
  45. <!DOCTYPE html>
  46. <html>
  47. <head>
  48. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  49. <title>upload test</title>
  50. </head>
  51.  
  52. <body>
  53. <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8') ?>" method="post" accept-charset="UTF-8" enctype="multipart/form-data">
  54. <input type="file" name="file[]" />
  55. <button type="submit">submit</button>
  56. </form>
  57. </body>
  58. </html>
  59. <?php
  60. }
  61. ?>


Je hebt overigens imagesx() en imagesy() (inderdaad) niet nodig, je hebt deze waarden al in $width en $height.
Bedankt door: JeroenI
Offline JeroenI - 14/03/2014 21:16
Avatar van JeroenI PHP interesse Toppie, opgelost. Bedankt!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.221s