2017-02-24 1 views
0

Ich möchte meine Bilder auf 400 x 300px Größe ändern. Und wenn das Bild größer als 400 px in der Breite ist, möchte ich zuerst die Größe ändern, bevor ich die Höhe beschneide.Php img Größe ändern vor Crop

Die Bilder kommen von Remote-Websites, so dass es im Hochformat und kann Landschaft sein, aber was ich erreichen möchte, ist die Menge des Zuschneidens wenn möglich zu minimieren, und Größe vor dem Zuschneiden wenn möglich.

Ich benutze die folgenden Codes (ich bin ein sehr verwirrend, um ehrlich zu sein). Nicht gerade gut mit Verhältnis und Zahlen. Codes stammen von mehreren SO-Antwortcodes.

function makeThumb($imgsrc, $imgtarg, $imgtarg_d) { 



    $ext = exif_imagetype($imgsrc); 

    if ($ext == false) { 
     return; 
    } 

//getting the image dimensions 
    list($width, $height) = getimagesize($imgsrc); 

//saving the image into memory (for manipulation with GD Library) 

    switch($ext) { 
     case 1: 
      $myImage = imagecreatefromgif($imgsrc); 
      break; 
     case 2: 
      $myImage = imagecreatefromjpeg($imgsrc); 
      break; 
     case 3: 
      $myImage = imagecreatefrompng($imgsrc); 
      break; 
    } 


// calculating the part of the image to use for thumbnail 
    if ($width > $height) { 
     $y = 0; 
     $x = ($width - $height)/2; 
     $smallestSide = $height; 

     if ($width >= 400) { 

      $thumbSizeWidth = 400; 
      $thumbSizeHeight = 300; 

     } else { 

      $thumbSizeWidth = $width; 
      $thumbSizeHeight = 300; 
     } 
    } else { 
     $x = 0; 
     $y = ($height - $width)/2; 
     $smallestSide = $width; 

     if ($height >= 300) { 
      $thumbSizeHeight = 300; 
      $thumbSizeWidth = 400; 
     } else { 
      $thumbSizeHeight = $height; 
      $thumbSizeWidth = 400; 
     } 


    } 

    $thumb = imagecreatetruecolor($thumbSizeWidth, $thumbSizeHeight); 

    /*RESIZE FIRST*/ 
    imagecopyresampled($thumb, $myImage, 0, 0, 0, $y, $thumbSizeWidth, $thumbSizeHeight, $width, $height); 

    /*CROP*/ 
    imagecopyresampled($thumb, $myImage, 0, 0, $x, $y, $thumbSizeWidth, $thumbSizeHeight, $smallestSide, $smallestSide); 

//final output 

    imagejpeg($thumb, $imgtarg_d . '/' . $imgtarg,80); 
    imagedestroy($thumb); 

} 

Die Bilder werden immer von der Mitte abgeschnitten (wie beabsichtigt), aber es ist Ändern der Größe nicht erst, wenn die Bilder mehr als 400px breit.

imagecopyresampled($thumb, $myImage, 0, 0, 0, $y, $thumbSizeWidth, $thumbSizeHeight, $width, $height); 
imagecopyresampled($thumb, $myImage, 0, 0, $x, $y, $thumbSizeWidth, $thumbSizeHeight, $smallestSide, $smallestSide); 

Antwort

0

Versuchen Sie, diese

//resize and crop image by center 
function resize_crop_image($max_width, $max_height, $source_file, $dst_dir, $quality = 80){ 
    $imgsize = getimagesize($source_file); 
    $width = $imgsize[0]; 
    $height = $imgsize[1]; 
    $mime = $imgsize['mime']; 

    switch($mime){ 
     case 'image/gif': 
      $image_create = "imagecreatefromgif"; 
      $image = "imagegif"; 
      break; 

     case 'image/png': 
      $image_create = "imagecreatefrompng"; 
      $image = "imagepng"; 
      $quality = 7; 
      break; 

     case 'image/jpeg': 
      $image_create = "imagecreatefromjpeg"; 
      $image = "imagejpeg"; 
      $quality = 80; 
      break; 

     default: 
      return false; 
      break; 
    } 

    $dst_img = imagecreatetruecolor($max_width, $max_height); 
    $src_img = $image_create($source_file); 

    $width_new = $height * $max_width/$max_height; 
    $height_new = $width * $max_height/$max_width; 
    //if the new width is greater than the actual width of the image, then the height is too large and the rest cut off, or vice versa 
    if($width_new > $width){ 
     //cut point by height 
     $h_point = (($height - $height_new)/2); 
     //copy image 
     imagecopyresampled($dst_img, $src_img, 0, 0, 0, $h_point, $max_width, $max_height, $width, $height_new); 
    }else{ 
     //cut point by width 
     $w_point = (($width - $width_new)/2); 
     imagecopyresampled($dst_img, $src_img, 0, 0, $w_point, 0, $max_width, $max_height, $width_new, $height); 
    } 

    $image($dst_img, $dst_dir, $quality); 

    if($dst_img)imagedestroy($dst_img); 
    if($src_img)imagedestroy($src_img); 
} 
//usage example 
resize_crop_image(100, 100, "test.jpg", "test.jpg"); 

source

+0

Ihr Code funktioniert sehr gut! Wie auch immer, ich denke ... kannst du mir zeigen, wo ich schneiden kann? IF Breite ist mehr als Höhe .. Ich möchte nicht die Höhe zuschneiden. –

Verwandte Themen