为什么我在PHP中调整大小的图像会出现失真?

时间:2014-01-20 16:13:17

标签: php image resize photos

我正在通过PHP调整图像大小,但它们的结果是扭曲的。我正在使用的代码如下。

我已经从80开始编辑了质量得分,但这并未以任何方式改变质量

可能有更好的方法可以做到这一点,任何建议都会有所帮助

// Image resize function with php + gd2 lib
function imageresize($source, $destination, $width = 0, $height = 0, $crop = false,     $quality = 80) {
$quality = $quality ? $quality : 80;
$image = imagecreatefromstring($source);
if ($image) {
    // Get dimensions
    $w = imagesx($image);
    $h = imagesy($image);
    //die(json_encode(array('width' => $w, 'height' => $h)));
    if (($width && $w > $width) || ($height && $h > $height)) {
        $ratio = $w / $h;
        if (($ratio >= 1 || $height == 0) && $width && !$crop) {
            $new_height = $width / $ratio;
            $new_width = $width;
        } elseif ($crop && $ratio <= ($width / $height)) {
            $new_height = $width / $ratio;
            $new_width = $width;
        } else {
            $new_width = $height * $ratio;
            $new_height = $height;
        }
    } else {
        $new_width = $w;
        $new_height = $h;
    }
    $x_mid = $new_width * .5;  //horizontal middle
    $y_mid = $new_height * .5; //vertical middle
    // Resample
    error_log('height: ' . $new_height . ' - width: ' . $new_width);
    $new = imagecreatetruecolor(floor($new_width), floor($new_height));
    $x = 0;
    if ($new_width > $new_height) {
        //$new_height = $new_height *8;
    } else {
        //$x = -$new_width * 7;
        //$new_width = $new_width *8;
    }
    imagecopyresampled($new, $image, 0, 0, $x, 0, $new_width, $new_height, $w, $h);
    // Crop
    if ($crop) {
        $crop = imagecreatetruecolor($width ? $width : $new_width, $height ? $height : $new_height);
        imagecopyresampled($crop, $new, 0, 0, ($x_mid - ($width * .5)), 0, $width, $height, $width, $height);
        //($y_mid - ($height * .5))
    }
    // Output
    // Enable interlancing [for progressive JPEG]
    imageinterlace($crop ? $crop : $new, true);

    $dext = strtolower(pathinfo($destination, PATHINFO_EXTENSION));
    if ($dext == '') {
        $dext = $ext;
        $destination .= '.' . $ext;
    }
    switch ($dext) {
        case 'jpeg':
        case 'jpg':
            imagejpeg($crop ? $crop : $new, $destination, $quality);
            break;
        case 'png':
            $pngQuality = ($quality - 100) / 11.111111;
            $pngQuality = round(abs($pngQuality));
            imagepng($crop ? $crop : $new, $destination, $pngQuality);
            break;
        case 'gif':
            imagegif($crop ? $crop : $new, $destination);
            break;
    }
    @imagedestroy($image);
    @imagedestroy($new);
    @imagedestroy($crop);
}

0 个答案:

没有答案