首頁 後端開發 php教程 php影像裁剪伺服器搭建

php影像裁剪伺服器搭建

Oct 15, 2019 am 10:49 AM
影像 裁切

        在我们的工作的项目中,有时候我们需要显示规定尺寸的图片,虽然可以通过css来控制显示大小。但是如果图片过大,会造成加载的延迟,影响网站整体性能。因此,我们需要一个服务器来帮助我们进行图片的裁剪。流程大致是,首先我们传给服务器原图像和裁剪的尺寸,然后服务器进行裁剪,生成对应的裁剪图片,下次我们再访问相同图像和相同的裁剪尺寸的时候,我们就不需要裁剪,直接进行图片的访问就行。

Talk is cheap, show me the code.

<?php
// ①构建图片请求地址比如  http://xxx.com/resize.php?site=www&width=300&height=200&mode=2&path=uploadfile/helloworld.png
// ②配置nginx重写规则  rewrite /s/(.*)/(\d+)x(\d+)-(\d)/(.*) /s/resize.php?site=$1&width=$2&height=$3&mode=$4&path=$5 last;
//③进行裁剪图片的处理
$path = trim($_GET[&#39;path&#39;]);
$mode = intval($_GET[&#39;mode&#39;]);
$site = trim($_GET[&#39;site&#39;]);
$width = intval($_GET[&#39;width&#39;]);
$height = intval($_GET[&#39;height&#39;]);
$site_list = array(&#39;crop&#39; => &#39;.&#39;);
$orig_dir = dirname(__FILE__);
if (!array_key_exists($site, $site_list)) {
    header(&#39;HTTP/1.1 400 Bad Request&#39;);
    exit();
}
if ($mode > 3 || $mode < 0) {
    header(&#39;HTTP/1.1 400 Bad Request&#39;);
    exit();
}
$orig_file = $site_list[$site] . $path;
if (!file_exists($orig_file)) {
    header(&#39;HTTP/1.1 404 Not Found&#39;);
    exit();
}
$file_ext = &#39;.&#39; . pathinfo($path, PATHINFO_EXTENSION);
$file_name = basename($path, $file_ext);
$save_path = "{$orig_dir}/{$site}/{$width}x{$height}-{$mode}{$path}";
$save_dir = dirname($save_path);
if (!file_exists($save_dir)) {
    wpx_mkdir($save_dir);
}
$target_width = $width;
$target_height = $height;
$save_image = $save_dir . &#39;/&#39; . $file_name . &#39;.jpg&#39;;
if (file_exists($save_image)) {
    header(&#39;Content-Type: image/jpeg&#39;);
    header(&#39;Last-Modified: &#39; . gmdate(&#39;D, d M Y H:i:s&#39;) . &#39; GMT&#39;);
    echo file_get_contents($save_image);
}
imagecropper2($orig_file, $target_width, $target_height, $save_image);
die;
//原图像对应缩放裁剪,会拉伸图片
function imagecropper2($source_path, $width, $height, $save_image)
{
    
    //获取原图像$filename的宽度$width_orig和高度$height_orig
    $info =  getimagesize($source_path);
    
    $width_orig = $info[0];
    $height_orig = $info[1];
    $mime = $info[&#39;mime&#39;];
    
    //根据参数$width和$height值,换算出等比例缩放的高度和宽度
    if ($width && ($width_orig<$height_orig)){
        $width = ($height/$height_orig)*$width_orig;
    }else{
        $height = ($width / $width_orig)*$height_orig;
    }
    //将原图缩放到这个新创建的图片资源中
    $image_p = imagecreatetruecolor($width, $height);
    //获取原图的图像资源
    if($mime==&#39;image/jpeg&#39;){
        $image = imagecreatefromjpeg($source_path);
    }elseif($mime==&#39;image/png&#39;){
        $image = imagecreatefrompng($source_path);
    }elseif($mime==&#39;image/gif&#39;){
        $image = imagecreatefromgif($source_path);
    }
    
    //使用imagecopyresampled()函数进行缩放设置
    imagecopyresampled($image_p,$image,0,0,0,0,$width,$height,$width_orig,$height_orig);
   
    //将缩放后的图片$image_p保存,100(质量最佳,文件最大)
    if($mime==&#39;image/jpeg&#39;){
        imagejpeg($image_p,$save_image);
        header(&#39;Content-Type: image/jpeg&#39;);
        imagejpeg($image_p);
    }elseif($mime==&#39;image/png&#39;){
        imagepng($image_p,$save_image);
        header(&#39;Content-Type: image/jpeg&#39;);
        imagepng($image_p);
    }else{
        imagegif($image_p,$save_image);
        header(&#39;Content-Type: image/jpeg&#39;);
        imagegif($image_p);
    }
    
}
//进行比例保存裁剪,会丢失图像部分像素
function imagecropper($source_path, $target_width, $target_height, $save_image)
{
    $source_info = getimagesize($source_path);
    $source_width = $source_info[0];
    $source_height = $source_info[1];
    $source_mime = $source_info[&#39;mime&#39;];
    $source_ratio = $source_height / $source_width;
    $target_ratio = $target_height / $target_width;
    // 源图过高
    if ($source_ratio > $target_ratio) {
        $cropped_width = $source_width;
        $cropped_height = $source_width * $target_ratio;
        $source_x = 0;
        $source_y = ($source_height – $cropped_height) / 2;
    }
    // 源图过宽
    elseif ($source_ratio < $target_ratio) {
        $cropped_width = $source_height / $target_ratio;
        $cropped_height = $source_height;
        $source_x = ($source_width – $cropped_width) / 2;
        $source_y = 0;
    }
    // 源图适中
    else {
        $cropped_width = $source_width;
        $cropped_height = $source_height;
        $source_x = 0;
        $source_y = 0;
    }
    switch ($source_mime) {
        case &#39;image/gif&#39;:
            $source_image = imagecreatefromgif($source_path);
            break;
        case &#39;image/jpeg&#39;:
            $source_image = imagecreatefromjpeg($source_path);
            break;
        case &#39;image/png&#39;:
            $source_image = imagecreatefrompng($source_path);
            break;
        default:
            return false;
            break;
    }
    $target_image = imagecreatetruecolor($target_width, $target_height);
    $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height);
    // 裁剪
    $bool = imagecopy($cropped_image, $source_image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height);
    // 缩放
    $bool = imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $target_width, $target_height, $cropped_width, $cropped_height);
    imagejpeg($target_image, $save_image);
    header(&#39;Content-Type: image/jpeg&#39;);
    imagejpeg($target_image);
    imagedestroy($source_image);
    imagedestroy($target_image);
    imagedestroy($cropped_image);
}
// 循环生成目录
function wpx_mkdir($dir, $mode = 0777)
{
    if (is_dir($dir) || @mkdir($dir, $mode)) {
        return true;
    }
    if (!wpx_mkdir(dirname($dir), $mode)) {
        return false;
    }
    return @mkdir($dir, $mode);
}
登入後複製

通过上面的处理,我们就将图片按照我们设置的尺寸进行了裁剪。我们还可以定期对裁剪图片进行清理,这样就不需要占用太多服务器空间。只有经常访问的图片才会一直保存。

 更多PHP相关知识,请访问PHP中文网

以上是php影像裁剪伺服器搭建的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在 Windows 11 中清除桌面背景最近的影像歷史記錄 如何在 Windows 11 中清除桌面背景最近的影像歷史記錄 Apr 14, 2023 pm 01:37 PM

&lt;p&gt;Windows 11 改進了系統中的個人化功能,這使用戶可以查看先前所做的桌面背景變更的近期歷史記錄。當您進入windows系統設定應用程式中的個人化部分時,您可以看到各種選項,而更改背景桌布也是其中之一。但是現在可以看到您系統上設置的背景壁紙的最新歷史。如果您不喜歡看到此內容並想清除或刪除此最近的歷史記錄,請繼續閱讀這篇文章,它將幫助您詳細了解如何使用註冊表編輯器進行操作。 &lt;/p&gt;&lt;h2&gt;如何使用登錄編輯

我該如何裁剪HTML中的IFrame? 我該如何裁剪HTML中的IFrame? Aug 29, 2023 pm 04:33 PM

內嵌框架在HTML中稱為iframe。標籤指定內容中的一個矩形區域,瀏覽器可以在其中顯示帶有捲軸和邊框的不同文件。若要在目前HTML文檔中嵌入另一個文檔,請使用內嵌框架。可以使用HTMLiframe名稱屬性指定元素的參考。在JavaScript中,對元素的參考也是使用name屬性進行的。 iframe本質上用於在目前顯示的網頁中顯示網頁。包含iframe的文件的URL使用「src」屬性指定。語法以下是HTML的語法<iframesrc="URL"title="d

如何在電腦上下載 Windows 聚光燈桌布影像 如何在電腦上下載 Windows 聚光燈桌布影像 Aug 23, 2023 pm 02:06 PM

窗戶從來不是一個忽視美學的人。從XP的田園綠場到Windows11的藍色漩渦設計,預設桌面桌布多年來一直是用戶愉悅的來源。借助WindowsSpotlight,您現在每天都可以直接存取鎖定螢幕和桌面桌布的美麗、令人敬畏的圖像。不幸的是,這些圖像並沒有閒逛。如果您愛上了Windows聚光燈圖像之一,那麼您將想知道如何下載它們,以便將它們作為背景保留一段時間。以下是您需要了解的所有資訊。什麼是WindowsSpotlight?窗口聚光燈是一個自動壁紙更新程序,可以從“設定”應用中的“個性化&gt

photoshop怎麼把歪的圖片裁成正的? ps裁剪傾斜照片教程 photoshop怎麼把歪的圖片裁成正的? ps裁剪傾斜照片教程 Mar 25, 2024 pm 10:07 PM

  有些用戶發現圖片上的某些東西是歪的,沒辦法直接框選裁剪,想知道有沒有什麼方法可以把圖片上的東西擺正呢?其實這個操作對於ps高手來說非常簡單,這裡小編給ps小白用戶講講photoshop把歪的圖片裁剪成正的,這個方法很容易操作,希望能幫到大家。  ps裁切傾斜照片教學  1、打開Photoshop,滑鼠移至左側的裁切工具,然後點選滑鼠右鍵,選擇「透視剪切工具」。  2、選擇需要擺正的圖片,確定好四個點。  3、然後按下回車鍵,即可成功地擺正。  4、這樣一來照片上的東西就變正了,而

如何在Python中使用影像語意分割技術? 如何在Python中使用影像語意分割技術? Jun 06, 2023 am 08:03 AM

隨著人工智慧技術的不斷發展,影像語意分割技術已成為影像分析領域的熱門研究方向。在影像語意分割中,我們將一張影像中的不同區域進行分割,並對每個區域進行分類,從而達到對這張影像的全面理解。 Python是一種著名的程式語言,其強大的資料分析和資料視覺化能力使其成為了人工智慧技術研究領域的首選。本文將介紹如何在Python中使用影像語意分割技術。一、前置知識在深入

iOS 17:如何在照片中使用一鍵裁剪 iOS 17:如何在照片中使用一鍵裁剪 Sep 20, 2023 pm 08:45 PM

透過iOS17照片應用,Apple可以更輕鬆地根據您的規格裁剪照片。繼續閱讀以了解如何操作。以前在iOS16中,在「照片」應用程式中裁剪圖像涉及幾個步驟:點擊編輯介面,選擇裁剪工具,然後透過捏合縮放手勢或拖曳裁剪工具的角落來調整裁剪。在iOS17中,值得慶幸的是,蘋果簡化了這個過程,這樣當你放大照片庫中任何選定的照片時,一個新的「裁剪」按鈕會自動出現在螢幕的右上角。點擊它會彈出完整的裁剪介面,其中包含您選擇的縮放級別,因此您可以裁剪到您喜歡的圖像部分,旋轉圖像,反轉圖像,或應用螢幕比例,或使用標記

2D影像腦補3D人體,衣服隨便搭,還能改動作 2D影像腦補3D人體,衣服隨便搭,還能改動作 Apr 11, 2023 pm 02:31 PM

由於 NeRF 提供的可微渲染,近期的三維生成模型已經在靜止物體上達到了令人驚豔的效果。但是在人體這種更複雜且可形變的類別上,三維生成依舊有很大的挑戰。本文提出了一個高效的組合的人體 NeRF 表達,實現了高分辨率(512x256)的三維人體生成,並且沒有使用超分模型。 EVA3D 在四個大型人體資料集上都大幅超越了現有方案,程式碼已開源。論文名稱:EVA3D: Compositional 3D Human Generation from 2D image Collections論文地址:http

如何在Windows上使用PowerToys批次調整影像大小 如何在Windows上使用PowerToys批次調整影像大小 Aug 23, 2023 pm 07:49 PM

那些必須每天處理圖像檔案的人經常不得不調整它們的大小以適應他們的專案和工作的需求。但是,如果要處理的圖像太多,則單獨調整它們的大小會消耗大量時間和精力。在這種情況下,像PowerToys這樣的工具可以派上用場,除此之外,可以使用其影像調整大小器實用程式批次調整影像檔案的大小。以下是設定影像調整器設定並開始使用PowerToys批次調整影像大小的方法。如何使用PowerToys批次調整影像大小PowerToys是一個多合一的程序,具有各種實用程式和功能,可協助您加快日常任務。它的實用程式之一是圖像

See all articles