Frage

Ich bin mit PHP Thumbnails zu generieren. Das Problem ist, dass ich eine Menge Breite und Höhe haben die Thumbnails sein müssen, und oft werden die Bilder gestreckt wird.

Was ich möchte, ist das Bild bei den gleichen Verhältnissen zu bleiben und nur noch schwarz Füllstoff (oder irgendeine Farbe) entweder auf die links und rechts für große Bilder oder oben und unten für breite Bilder.

Hier ist der Code, den ich zur Zeit bin mit: (verdummt ein wenig zur besseren Lesbarkeit)

$temp_image_file = imagecreatefromjpeg("http://www.example.com/image.jpg");

list($width,$height) = getimagesize("http://www.example.com/image.jpg");

$image_file = imagecreatetruecolor(166,103);

imagecopyresampled($image_file,$temp_image_file,0,0,0,0,166,103,$width,$height);
imagejpeg($image_file,"thumbnails/thumbnail.jpg",50);

imagedestroy($temp_image_file);
imagedestroy($image_file);
War es hilfreich?

Lösung

Sie müssen die neue Breite und Höhe berechnen, das Bild proportionat zu halten. Schauen Sie sich beispielsweise 2 auf dieser Seite:

http://us3.php.net/imagecopyresampled

Andere Tipps

Okay, hätte es funktioniert, hier ist was ich am Ende tun:

$filename = "http://www.example.com/image.jpg";

list($width,$height) = getimagesize($filename);

$width_ratio = 166 / $width;
if ($height * $width_ratio <= 103)
{
    $adjusted_width = 166;
    $adjusted_height = $height * $width_ratio;
}
else
{
    $height_ratio = 103 / $height;
    $adjusted_width = $width * $height_ratio;
    $adjusted_height = 103;
}

$image_p = imagecreatetruecolor(166,103);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p,$image,ceil((166 - $adjusted_width) / 2),ceil((103 - $adjusted_height) / 2),0,0,ceil($adjusted_width),ceil($adjusted_height),$width,$height);

imagejpeg($image_p,"thumbnails/thumbnail.jpg",50);

Hier ist eine Funktion, die ich schrieb, dass ein GD-Bildobjekt nimmt, max Breite, max Höhe und rescales innerhalb dieser Parameter:

function resized($im, $mx, $my) {
  $x = $nx = imagesx($im);
  $y = $ny = imagesy($im);
  $ar = $x / $y;
  while ($nx > $mx || $ny > $my) {
    if ($nx > $mx) {
      $nx = $mx;
      $ny = $nx / $ar;
    }
    if ($ny > $my) {
      $ny = $my;
      $nx = $ny * $ar;
    }
  }
  if ($nx != $x) {
    $im2 = imagecreatetruecolor($nx, $ny);
    imagecopyresampled($im2, $im, 0, 0, 0, 0, $nx, $ny, $x, $y);
    return $im2;
  } else {
    return $im;
  }
}

Wenn das resultierende Bild benötigt rescaling nicht dann einfach das Originalbild zurück.

Haben Sie einen Blick auf diese Upload-Klasse . Es tut, was Sie wollen und vieles mehr.

Dieses neu skaliert das Bild auf die größere Größe der Breite und Höhe und dann beschneidet es auf die richtige Größe.

// Crete an image forced to width and height
    function createFixedImage($img, $id=0, $preFix=false, $mw='100', $mh='100', $quality=90){

        // Fix path
        $filename = '../'.$img;

        // Check for file
        if(file_exists($filename))
        {           
            // Set a maximum height and width
            $width = $mw;
            $height = $mh;

            // Get new dimensions
            list($width_orig, $height_orig) = getimagesize($filename);

            $ratio_orig = $width_orig/$height_orig;

            if ($width/$height < $ratio_orig) {
                   $width = $height*$ratio_orig;
            }else{
                   $height = $width/$ratio_orig;
                }

            // Resample
            $image_p = imagecreatetruecolor($mw, $mh);
            $image = imagecreatefromjpeg($filename);
            imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

            // Output
            imagejpeg($image_p, "../images/stories/catalog/{$preFix}{$id}.jpg", $quality);
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top