图片16:9缩放

2017/4/15 posted in  PHP
function crop_image($image) {
    list($w_i, $h_i, $type) = getimagesize($image);
 
    $w_o = $w_i;
    $h_o = 9 * $w_o / 16;
 
    if ($h_i < $h_o) {
        $h_o = $h_i;
        $w_o = 16 * $h_o / 9;
    }
 
    $x_o = $w_i - $w_o;
    $y_o = $h_i - $h_o;
 
    $types = array("", "gif", "jpeg", "png");
    $ext = $types[$type];
    if ($ext) {
      $func = 'imagecreatefrom'.$ext;
      $img_i = $func($image);
    } else {
      echo 'Incorrect image';
      return false;
    }
    if ($x_o + $w_o > $w_i) $w_o = $w_i - $x_o;
    if ($y_o + $h_o > $h_i) $h_o = $h_i - $y_o;
    $img_o = imagecreatetruecolor($w_o, $h_o);
    imagecopy($img_o, $img_i, 0, 0, $x_o/2, $y_o/2, $w_o, $h_o);
    $func = 'image'.$ext;
    return $func($img_o, $image);  
}
 
crop_image("screen.png");

改良后的代码(解决获取图片宽高错误)

function crop_image($image) {
    $img = imagecreatefromstring(file_get_contents($image));
    $exif = @exif_read_data($image);
    if( ! empty($exif['Orientation'])) {
        switch($exif['Orientation']) {
            case 8:
                $img = imagerotate($img, 90, 0);
                break;
            case 3:
                $img = imagerotate($img, 180, 0);
                break;
            case 6:
                $img = imagerotate($img, -90, 0);
                break;
        }
        list($_, $_, $type) = getimagesize($image);
        $types = array("", "gif", "jpeg", "png");
        $ext = $types[$type];
        $func = 'image'.$ext;
        $func($img, $image);
    }
    list($w_i, $h_i, $type) = getimagesize($image);
 
    $w_o = $w_i;
    $h_o = 9 * $w_o / 16;
 
    if ($h_i < $h_o) {
        $h_o = $h_i;
        $w_o = 16 * $h_o / 9;
    }
 
    $x_o = $w_i - $w_o;
    $y_o = $h_i - $h_o;
 
    $types = array("", "gif", "jpeg", "png");
    $ext = $types[$type];
    if ($ext) {
      $func = 'imagecreatefrom'.$ext;
      $img_i = $func($image);
    } else {
      echo 'Incorrect image';
      return false;
    }
    if ($x_o + $w_o > $w_i) $w_o = $w_i - $x_o;
    if ($y_o + $h_o > $h_i) $h_o = $h_i - $y_o;
    $img_o = imagecreatetruecolor($w_o, $h_o);
    imagecopy($img_o, $img_i, 0, 0, $x_o/2, $y_o/2, $w_o, $h_o);
    $func = 'image'.$ext;
    return $func($img_o, $image);
}
 
crop_image("1.jpg");