簡體   English   中英

如何調整圖像大小保持約束PHP

[英]How to resize image keeping constraints php

我做了兩個GIF來解釋我要做什么。 灰色邊框是我要的尺寸(700 * 525)。 他們是這個問題的根本。

我希望所有大於給定寬度和高度的圖像都縮小到邊框(從中心),然后裁剪邊緣。 這是我整理的一些代碼來嘗試這種操作:

if ($heightofimage => 700 && $widthofimage => 525){
    if ($heightofimage > $widthofimage){

        $widthofimage = 525;
        $heightofimage = //scaled height.

        //crop height to 700.

    }

    if ($heightofimage < $widthofimage){

        $widthofimage = //scaled width.
        $heightofimage = 700;

        //crop width to 525.

    }
}else{
    echo "image too small";
}

以下是一些GIF,可以直觀地解釋我要實現的目標:

GIF 1:此處x方向的圖像比例太大

在此處輸入圖片說明

GIF 2:此處的圖像比例在y方向上太大

在此處輸入圖片說明


@timclutton的圖像質量比較

因此,我已將您的方法與PHP結合使用(單擊此處以對php進行自己的測試) ,然后將其與原始照片進行比較,您會發現它們之間有很大的不同!:

您的PHP方法:

在此處輸入圖片說明
(來源: tragicclothing.co.uk

實際文件:

在此處輸入圖片說明


下面的代碼應做您想要的。 我沒有對其進行廣泛的測試,但是它似乎可以在我制作的一些測試圖像上使用。 在我心中有一個小小的疑問,我的數學錯誤在某處,但是已經晚了,我看不到任何明顯的東西。

編輯 :它足夠讓我再次經過,發現該錯誤,那就是該作物不在圖像的中間。 代碼已替換為工作版本。

簡而言之:將其作為起點,而不是可用於生產的代碼!

<?php

// set image size constraints.
$target_w = 525;
$target_h = 700;

// get image.
$in = imagecreatefrompng('<path to your>.png');

// get image dimensions.
$w = imagesx($in);
$h = imagesy($in);

if ($w >= $target_w && $h >= $target_h) {
    // get scales.
    $x_scale = ($w / $target_w);
    $y_scale = ($h / $target_h);

    // create new image.
    $out = imagecreatetruecolor($target_w, $target_h);

    $new_w = $target_w;
    $new_h = $target_h;
    $src_x = 0;
    $src_y = 0;

    // compare scales to ensure we crop whichever is smaller: top/bottom or
    // left/right.
    if ($x_scale > $y_scale) {
        $new_w = $w / $y_scale;

        // see description of $src_y, below.
        $src_x = (($new_w - $target_w) / 2) * $y_scale;
    } else {
        $new_h = $h / $x_scale;

        // a bit tricky. crop is done by specifying coordinates to copy from in
        // source image. so calculate how much to remove from new image and
        // then scale that up to original. result is out by ~1px but good enough.
        $src_y = (($new_h - $target_h) / 2) * $x_scale;
    }

    // given the right inputs, this takes care of crop and resize and gives
    // back the new image. note that imagecopyresized() is possibly quicker, but
    // imagecopyresampled() gives better quality.
    imagecopyresampled($out, $in, 0, 0, $src_x, $src_y, $new_w, $new_h, $w, $h);

    // output to browser.
    header('Content-Type: image/png');
    imagepng($out);
    exit;

} else {
    echo 'image too small';
}

?>

使用Imagick

define('PHOTO_WIDTH_THUMB', 700);
define('PHOTO_HEIGHT_THUMB', 525);

$image = new Imagick();
$image->readImage($file_source);
$width = $image->getImageWidth();
$height = $image->getImageHeight();

if($width > $height){
  $image->thumbnailImage(0, PHOTO_HEIGHT_THUMB);
}else{
  $image->thumbnailImage(PHOTO_WIDTH_THUMB, 0);
}

$thumb_width = $image->getImageWidth();
$thumb_height = $image->getImageHeight();
$x = ($thumb_width - PHOTO_WIDTH_THUMB)/2;
$y = ($thumb_height - PHOTO_HEIGHT_THUMB)/2;
$image->cropImage(PHOTO_THUMB_WIDTH, PHOTO_THUMB_HEIGHT, $x, $y);
$image->writeImage($thumb_destination);

$image->clear();
$image->destroy();
unlink($file_source);

我已經使用GD庫來完成調整大小。 基本上我所做的是,我計算了圖像尺寸,然后將圖像調整為從中心到尺寸700x525。

<?php
/*
 * PHP GD
 * resize an image using GD library
 */

//the image has 700X525 px ie 4:3 ratio
$src = 'demo_files/bobo.jpg';

// Get new sizes
list($width, $height) = getimagesize($src);

$x = 0;
$y = 0;
if($width < $height){
    $newwidth = $width;
    $newheight = 3/4 * $width;
    $x = 0;
    $y = $height/2 - $newheight/2;
}else{
    $newheight = $height;
    $newwidth = 4/3 * $height;
    $x=$width/2 - $newwidth/2;
    $y=0;

}

$targ_w = 700; //width of the image to be resized to
$targ_h = 525; ////height of the image to be resized to
$jpeg_quality = 90;

$img_r = imagecreatefromjpeg($src);
$dst_r = ImageCreateTrueColor( $targ_w, $targ_h );

imagecopyresampled($dst_r,$img_r,0,0,$x,$y,$targ_w,$targ_h,$newwidth,$newheight);

header('Content-type: image/jpeg');
imagejpeg($dst_r,null,$jpeg_quality);

exit;

?>

我使用http://phpthumb.sourceforge.net也有一個漂亮的解決方案,它也具有透明的彎曲邊緣。

這是解決方案的另一種方法,可能只需很少的配置即可滿足某人的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM