簡體   English   中英

PHP上傳后調整圖像大小並裁剪到中心

[英]php resize image after upload and crop it to the center

我在php中有一個用戶個人資料,我想給用戶選擇更改其個人資料圖片的選擇。 但是當他們通過$ _POST提交新圖片時,我希望將圖片調整為:

高度:110像素| 寬度:與高度有關(如果寬度大於高度)

寬度:110像素| height:與寬度有關(如果高度大於寬度)

調整大小后,我想裁剪圖片,使其變為110px x 110px,但我希望將其居中。

例如,如果用戶上載寬度為110像素,高度為200像素(調整尺寸后的尺寸)的圖片,則裁剪后的新圖像將為110x110,從右側裁剪90像素。 我想要的是從左側裁切45px,從右側裁切另一個45px,以便將其居中

該函數將接受.png.gif.jpg圖像,並且無論初始格式是什么,都將僅以jpg格式保存新圖像。

我進行了很多搜索以創建這樣的函數,並且找到了答案,但是每當我嘗試更改一些細微的細節時,一切都會停止正常工作。

到目前為止,我的代碼:

<?php

$userfile_name = $_FILES["sgnIMG"]["name"];
$userfile_tmp = $_FILES["sgnIMG"]["tmp_name"];
$userfile_size = $_FILES["sgnIMG"]["size"];
$filename = basename($_FILES["sgnIMG"]["name"]);
$file_ext = substr($filename, strrpos($filename, ".") + 1);
$large_image_location = $target_path . $filename;
$ext = '';

if ($file_ext == 'jpg') {
    $ext = 1;
} else if ($file_ext == 'gif') {
    $ext = 2;
} else if ($file_ext == 'png') {
    $ext = 3;
} else {
    $ext = 0;
}

$target = $target_path . basename($_FILES["sgnIMG"]["name"]);

if (move_uploaded_file($userfile_tmp, $target)) {
    $newImg = resize110($target, $ext);
    if (isset($_POST['imupd']) && ($_POST['imupd'] == 'up')) {
        $sql = "UPDATE users SET avatar='" . str_replace('im/users/', '', $newImg) . "' WHERE id=" . $_SESSION['sesID'] . "";
        $result = mysql_query($sql);
        if ($result) {
            echo '<img src="' . $newImg . '" width="110" title="' . $file_ext . '"/>';
        } else {
            echo '<img src="im/avatars/px.png" width="110" title="' . $file_ext . '"/>';
        }
    }
} else {

}

function getHeight($image)
{
    $sizes = getimagesize($image);
    $height = $sizes[1];
    return $height;
}

function getWidth($image)
{
    $sizes = getimagesize($image);
    $width = $sizes[0];
    return $width;
}

function resize110($image, $ext)
{
    chmod($image, 0777);
    $oldHeight = getHeight($image);
    $oldWidth = getWidth($image);
    if ($oldHeight < $oldWidth) {
        $newImageHeight = 110;
        $newImageWidth = ceil((110 * $oldWidth) / $oldHeight);
        imagecopyresampled($newImage, $source, -ceil(($newImageWidth - 110) / 2), 0, 0, 0, $newImageWidth, $newImageHeight, $oldWidth, $oldHeight);
    } else {
        $newImageHeight = ceil((110 * $oldHeight) / $oldWidth);
        $newImageWidth = 110;
        imagecopyresampled($newImage, $source, 0, -ceil(($newImageHeight - 110) / 2), 0, 0, $newImageWidth, $newImageHeight, $oldWidth, $oldHeight);
    }
    $newImage = imagecreatetruecolor(110, 110);
    chmod($image, 0777);
    return $image;
    switch ($ext) {
        case 1;
            $source = imagecreatefromjpeg($image);
            break;
        case 2;
            $source = imagecreatefromgif($image);
            break;
        case 3;
            $source = imagecreatefrompng($image);
            break;
    }

    imagejpeg($newImage, $image, 90);
    return $image;
}

我四處張望,並組合了發現的代碼的不同部分。 因此,此腳本將采用jpg,gif的png圖像,如果寬度較大則將其大小調整為110px寬度,如果高度較大則將其調整為110px高度。 寬高比將保持不變,因此剩余像素將被2除以將圖像居中。

對於不同的大小,只需在各處更改110。

================================================== ================================

<?php

// pfpic  ->  the name of the <input type="file" name="pfpic"/> where user chooses file

$target_path = "im/users/";                                // the directory to store the uploaded and then resampled image
$userfile_name = $_FILES["pfpic"]["name"];                  // the name that the image file will have once uploaded
$userfile_tmp = $_FILES["pfpic"]["tmp_name"];                   // the temporary name the server uses to store the file
$userfile_size = $_FILES["pfpic"]["size"];                  // the size of the file that we want to upload
$filename = basename($_FILES["pfpic"]["name"]);             // the full name of the file
$file_ext = substr($filename, strrpos($filename, ".") + 1);  // the file extension
$large_image_location = $target_path.$filename;                  // the full path to the file
$ext='';


if($file_ext=='jpg')
{
    $ext=1;
}
else if ($file_ext=='gif')
{
    $ext=2;
}
else if ($file_ext=='png')
{
    $ext=3;
}
else
{
    $ext=0;
}

    $target = $target_path.basename(sha1($_SESSION['sesID']).'.'.'jpg');
    if($ext!=0)
    {
        if(move_uploaded_file($userfile_tmp,$target))
        {
            $newImg=resize110($target,$ext);
            echo '<img src="'.$newImg.'"/>';
        }
        else
        {
            echo 'the file could not be uploaded, please try again';
        }
    }
    else
    {
        echo 'this file extension is not accepted, please use "jpg", "gif" or "png" file formats';
    }

    function getHeight($image) 
    {
        $sizes = getimagesize($image);
        $height = $sizes[1];
        return $height;
    }

    function getWidth($image) 
    {
        $sizes = getimagesize($image);
        $width = $sizes[0];
        return $width;
    }


    function resize110($image,$ext) 
    {
        chmod($image, 0777);
        $oldHeight=getHeight($image);
        $oldWidth=getWidth($image);
        switch ($ext)
        {
            case 1;
                $source = imagecreatefromjpeg($image);
            break;

            case 2;
                $source = imagecreatefromgif($image);
            break;

            case 3;
                $source = imagecreatefrompng($image);
            break;
        }
        $newImage = imagecreatetruecolor(110,110);
        $bgcolor = imagecolorallocate($newImage, 255, 255, 255);
        imagefill($newImage, 0, 0, $bgcolor);       // use this if you want to have a white background instead of black


        // we check tha width and height and then we crop the image to the center
        if($oldHeight<$oldWidth)
        {
            $newImageHeight = 110;
            $newImageWidth = ceil((110*$oldWidth)/$oldHeight);
            imagecopyresampled($newImage,$source,-ceil(($newImageWidth-110)/2),0,0,0,$newImageWidth,$newImageHeight,$oldWidth,$oldHeight);
        }
        else
        {
            $newImageHeight = ceil((110*$oldHeight)/$oldWidth);
            $newImageWidth = 110; 
            imagecopyresampled($newImage,$source,0,-ceil(($newImageHeight-110)/2),0,0,$newImageWidth,$newImageHeight,$oldWidth,$oldHeight);
        }

        //we save the image as jpg resized to 110x110 px and cropped to the center. the old image will be replaced
        imagejpeg($newImage,$image,90);

        return $image;

    }

?>

暫無
暫無

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

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