Ik ben nu bezig met een upload scriptje en wil de foto's verkleinen naar 500px breed. Ik ben niet tevreden over de kwaliteit. Flickr gebruikt ook 500px breedte en daar worden ze veel mooier weergeven.

Voorbeeld mijn scriptje:


Voorbeeld Flickr:


Ik gebruik deze: thumbnail class en gebruik deze code om te uploaden:

<?php
include('includes/classes/thumbnail.php');

$path = 'afbeeldingen/';
$image_width = 500;
$thumbnail_size = 100;


//-- form's been posted, size is bigger than 25kb, tmp file exists and it's a jpg, jpeg, png or gif file
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $_FILES['userfile']['size'] > 25 && is_uploaded_file($_FILES['userfile']['tmp_name']) && (strtolower(substr($_FILES['userfile']['name'], -3)) == 'jpg' || strtolower(substr($_FILES['userfile']['name'], -4)) == 'jpeg' || strtolower(substr($_FILES['userfile']['name'], -3)) == 'png' || strtolower(substr($_FILES['userfile']['name'], -3)) == 'gif'))
{
  $filename = date('Y-m-d') . '_' . $_SESSION['id'] . '_' . substr($_FILES['userfile']['name'], 0, 30);
	
  //--- upload image naar $path
  move_uploaded_file($_FILES['userfile']['tmp_name'], $path . $filename);

  //--- resize to max width
  $thumb=new thumbnail($path . $filename);            // generate image_file, set filename to resize
  //$thumb->size_width($thumbnail_size);                // set width for thumbnail, or
  //$thumb->size_height($thumbnail_size);                // set height for thumbnail, or
  $thumb->size_auto(500);                    // set the biggest width or height for thumbnail
  $thumb->jpeg_quality(100);
  $thumb->show();                        // show your thumbnail
  //$thumb->save("./huhu.jpg");                // save your thumbnail to file
}
else
{
  echo '<form method="post" action="' . $_SERVER['PHP_SELF'] . '" enctype="multipart/form-data">';
  echo '<p>';
  echo '<input type="file" name="userfile" value="" /><br />';
  echo '<input type="submit" name="submit" value="Upload\'n!" />';	
  echo '</p>';
  echo '</form>';
}
?>


Doe ik iets verkeerd? Ik heb het ook met andere scriptjes geprobeerd, maar de kwaliteit blijft ook daar niet naar mijn standaarden :) :) Heeft iemand tips hoe dit wel aan te pakken? Want ik wil geen vervormde foto's op mijn website.
Heb het antwoord gevonden. In de class wordt [php]imagecopyresize[/php] gebruikt. Deze heb ik vervangen voor een ander functie:

<?php
    function ImageCopyResampleBicubic($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
    {
      /*
       * Port to PHP by John Jensen July 10 2001 -- original code
       * (in C, for the PHP GD Module) by [email protected]
       */
      for ($i = 0; $i < 256; $i++)
      {
        // get pallete. Is this algoritm correct?
        $colors = ImageColorsForIndex ($src_img, $i);
        ImageColorAllocate($dst_img, $colors['red'], $colors['green'], $colors['blue']);
      }
      $scaleX = ($src_w - 1) / $dst_w;
      $scaleY = ($src_h - 1) / $dst_h;
      $scaleX2 = $scaleX / 2.0;
      $scaleY2 = $scaleY / 2.0;
      for ($j = $src_y; $j < $dst_h; $j++)
      {
        $sY = $j * $scaleY;
        for ($i = $src_x; $i < $dst_w; $i++)
        {
          $sX = $i * $scaleX;
          $c1 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY + $scaleY2));
          $c2 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY));
          $c3 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY + $scaleY2));
          $c4 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY));
          $red = (int) (($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4);
          $green = (int) (($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4);
          $blue = (int) (($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4);
          $color = ImageColorClosest ($dst_img, $red, $green, $blue);
          ImageSetPixel ($dst_img, $i + $dst_x, $j + $dst_y, $color);
        }
      }
    } 
?>


En heb in de class nu dus staan:

<?php
$this->ImageCopyResampleBicubic ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);
?>
die class is al zwaar verouderd:
# 11 March 2003

gebruik een recente, en vervang imagecopyresized door imagecopyresampled. Dat zorgt voor betere kwaliteit
Volgens mij was het zo dat [google]ImageMagick[/google] sowieso betere resultaten gaf dan gd, misschien kan je daar naar kijken.
Tnx Karl, gebruk nu bovenstaande class en die werkt goed! :D

Reageren