2010-01-05 6 views
15

Ich möchte ein Bild in PHP beschneiden und die Datei speichern. Ich weiß, dass du die GD-Bibliothek benutzen solltest, aber ich weiß nicht, wie. Irgendwelche Ideen?Bild in PHP zuschneiden

Dank

Antwort

23

könnten Sie imagecopy verwenden, um einen gewünschten Teil eines Bildes zu beschneiden. Der Befehl so geht:

imagecopy ( 
    resource $dst_im - the image object , 
    resource $src_im - destination image , 
    int $dst_x - x coordinate in the destination image (use 0) , 
    int $dst_y - y coordinate in the destination image (use 0) , 
    int $src_x - x coordinate in the source image you want to crop , 
    int $src_y - y coordinate in the source image you want to crop , 
    int $src_w - crop width , 
    int $src_h - crop height 
) 

-Code von PHP.net - ein 80x40 Pixel Bild wird von einem Quellbild abgeschnitten

<?php 
// Create image instances 
$src = imagecreatefromgif('php.gif'); 
$dest = imagecreatetruecolor(80, 40); 

// Copy 
imagecopy($dest, $src, 0, 0, 20, 13, 80, 40); 

// Output and free from memory 
header('Content-Type: image/gif'); 
imagegif($dest); 

imagedestroy($dest); 
imagedestroy($src); 
?> 
+0

Danke für die schnelle Antwort !! – user244228

+0

Wendet diese Methode keinen schwarzen Hintergrund zu PNG-Bildern? Ich meine über den transparenten Hintergrund? – bayblade567

1

ein Bild zu beschneiden GD verwenden Sie eine Kombination von GD Methoden verwenden, und wenn Sie sich "Beispiel # 1" in der PHP-Dokumentation der imagecopyresampled-Methode ansehen, zeigt es Ihnen, wie Sie ein Bild zuschneiden und ausgeben, Sie müssten nur etwas Code hinzufügen, um die Ausgabe zu erfassen und in eine Datei zu schreiben.

http://us2.php.net/manual/en/function.imagecopyresampled.php

Es gibt auch andere Optionen, einschließlich Image Magick, die installiert, wenn auf Ihrem Server zugegriffen werden kann exec Methode direkt von PHP (oder ähnlich) oder Sie können die PHP Imagick Erweiterung installieren, die eine höhere Bildqualität liefert und, in meiner Meinung nach, ist ein wenig intuitiver und flexibler zu arbeiten.

Schließlich habe ich die Open Source PHPThumb Klassenbibliothek verwendet, die eine ziemlich einfache Schnittstelle hat und mit mehreren Optionen arbeiten kann, abhängig davon, was auf Ihrem Server ist, einschließlich ImageMagick und GD.

0

Ich benutze dieses Skript in einigen Projekten und es ist ziemlich einfach zu bedienen: http://shiftingpixel.com/2008/03/03/smart-image-resizer/

Das Skript benötigt PHP 5.1.0 (die 2005-11-24 da ist out - Zeit, wenn noch nicht auf diese aktualisieren Version) und GD (was bei guten Webhosts selten fehlt). Hier

ist ein Beispiel dafür den Einsatz in Ihrem HTML ist:

<img src="/image.php/coffee-bean.jpg?width=200&amp;height=200&amp;image=/wp-content/uploads/2008/03/coffee-bean.jpg" alt="Coffee Bean" /> 
+0

shiftingpixel.com scheint im Moment versuchen Sie den Link später :) – AlexV

+0

shiftingpixel.com ist jetzt zurück :) – AlexV

3

Diese Funktion Bild zuschneiden Bildseitenverhältnis beibehalten wird :)

function resize_image_crop($image, $width, $height) 
    { 

     $w = @imagesx($image); //current width 

     $h = @imagesy($image); //current height 
     if ((!$w) || (!$h)) { $GLOBALS['errors'][] = 'Image couldn\'t be resized because it wasn\'t a valid image.'; return false; } 
     if (($w == $width) && ($h == $height)) { return $image; } //no resizing needed 
     $ratio = $width/$w;  //try max width first... 
     $new_w = $width; 
     $new_h = $h * $ratio;  
     if ($new_h < $height) { //if that created an image smaller than what we wanted, try the other way 
      $ratio = $height/$h; 
      $new_h = $height; 
      $new_w = $w * $ratio; 
     } 
     $image2 = imagecreatetruecolor ($new_w, $new_h); 
     imagecopyresampled($image2,$image, 0, 0, 0, 0, $new_w, $new_h, $w, $h);  
     if (($new_h != $height) || ($new_w != $width)) { //check to see if cropping needs to happen 
      $image3 = imagecreatetruecolor ($width, $height); 
      if ($new_h > $height) { //crop vertically 
       $extra = $new_h - $height; 
       $x = 0; //source x 
       $y = round($extra/2); //source y 
       imagecopyresampled($image3,$image2, 0, 0, $x, $y, $width, $height, $width, $height); 
      } else { 
       $extra = $new_w - $width; 
       $x = round($extra/2); //source x 
       $y = 0; //source y 
       imagecopyresampled($image3,$image2, 0, 0, $x, $y, $width, $height, $width, $height); 
      } 
      imagedestroy($image2); 
      return $image3; 
     } else { 
      return $image2; 
     } 
    } 
+0

Sollte nicht mehrere imagecopyresampled Anrufe tun, kann es alle auf einen Anruf erfolgen, wenn der Offset in der $ Breite berechnet wird und $ Höhe. Außerdem ist es möglicherweise vorzuziehen, die Größenänderung immer zu erzwingen, um sicherzustellen, dass das Bild in einem neuen Format gespeichert wird, in dem zusätzliche überflüssige Dateien und Header entfernt und eine bestimmte Qualität erzwungen wird. – Exit

-1

Sie unter Methode zur Ernte Bild verwenden können,

/*parameters are 
    $image =source image name 
    $width = target width 
    $height = height of image 
    $scale = scale of image*/ 
    function resizeImage($image,$width,$height,$scale) { 
     //generate new image height and width of source image 
     $newImageWidth = ceil($width * $scale); 
     $newImageHeight = ceil($height * $scale); 
     //Create a new true color image 
     $newImage = imagecreatetruecolor($newImageWidth,$newImageHeight); 
     //Create a new image from file 
     $source = imagecreatefromjpeg($image); 
     //Copy and resize part of an image with resampling 
     imagecopyresampled($newImage,$source,0,0,0,0,$newImageWidth,$newImageHeight,$width,$height); 
     //Output image to file 
     imagejpeg($newImage,$image,90); 
     //set rights on image file 
     chmod($image, 0777); 
     //return crop image 
     return $image; 
    } 
+0

Es kann für Benutzer hilfreich sein, wenn Sie Ihrem Code Kommentare hinzufügen, um zu erläutern, welche Schlüsselteile dies tun. Dies würde ihnen helfen, Ihren Code besser zu verstehen und anzuwenden – shrmn

+0

ok, ich habe hinzugefügt –

0

Ich habe gerade diese Funktion erstellt und es funktioniert für meine Bedürfnisse, Erstellen einer zentrierten und beschnittenen Vorschaubild. Es ist optimiert und erfordert nicht mehrere Imagecopy-Aufrufe, wie in der WebGautam-Antwort gezeigt.

Geben Sie den Bildpfad, die endgültige Breite und Höhe und optional die Qualität des Bilds an. Ich habe dies zum Erstellen von Thumbnails gemacht, also werden alle Bilder als JPGs gespeichert, Sie können sie bearbeiten, um andere Bildtypen aufzunehmen, wenn Sie sie benötigen. Der Hauptpunkt hier ist die Mathematik und die Methode der Verwendung von imagecopyresampled, um ein Thumbnail zu erzeugen. Bilder werden unter dem gleichen Namen und der Bildgröße gespeichert.

function resize_crop_image($image_path, $end_width, $end_height, $quality = '') { 
if ($end_width < 1) $end_width = 100; 
if ($end_height < 1) $end_height = 100; 
if ($quality < 1 || $quality > 100) $quality = 60; 

$image = false; 
$dot = strrpos($image_path,'.'); 
$file = substr($image_path,0,$dot).'-'.$end_width.'x'.$end_height.'.jpg'; 
$ext = substr($image_path,$dot+1); 

if ($ext == 'jpg' || $ext == 'jpeg') $image = @imagecreatefromjpeg($image_path); 
elseif($ext == 'gif') $image = @imagecreatefromgif($image_path); 
elseif($ext == 'png') $image = @imagecreatefrompng($image_path); 

if ($image) { 
    $width = imagesx($image); 
    $height = imagesy($image); 
    $scale = max($end_width/$width, $end_height/$height); 
    $new_width = floor($scale*$width); 
    $new_height = floor($scale*$height); 
    $x = ($new_width != $end_width ? ($width - $end_width)/2 : 0); 
    $y = ($new_height != $end_height ? ($height - $end_height)/2 : 0); 
    $new_image = @imagecreatetruecolor($new_width, $new_height); 

    imagecopyresampled($new_image,$image,0,0,$x,$y,$new_width,$new_height,$width - $x,$height - $y); 
    imagedestroy($image); 
    imagejpeg($new_image,$file,$quality); 
    imagedestroy($new_image); 

    return $file; 
} 
return false; 
}