成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ThinkPHP3.2+Krpano實(shí)現(xiàn)全景圖

My_Oh_My / 1321人閱讀

摘要:為了實(shí)現(xiàn)全立體的全景圖效果,我們采用了軟件將普通魚(yú)眼圖片渲染為全景圖說(shuō)明代碼有過(guò)調(diào)整,并不能保證運(yùn)行,主要說(shuō)明實(shí)現(xiàn)思路。顯示全景圖要將圖片顯示出來(lái),我們必須按照規(guī)則生成必須的配置文件。我們將根據(jù)上傳圖片是生成的唯一碼作為依據(jù)生成全景圖。

為了實(shí)現(xiàn)全立體的3D全景圖效果,我們采用了Krpano軟件將普通魚(yú)眼圖片渲染為720°全景圖

說(shuō)明:代碼有過(guò)調(diào)整,并不能保證運(yùn)行,主要說(shuō)明實(shí)現(xiàn)思路。
首先下載軟件Krpano全景圖生成軟件,提取碼z2zu,其中包含Linux版本及Win版本以及簡(jiǎn)單的使用手冊(cè)文件。
其實(shí)簡(jiǎn)單的使用只需兩步,第一步是將上傳的圖片生成顯示全景圖需要的圖片,第二步是根據(jù)全景圖的顯示規(guī)則和配置文件將全景圖顯示出來(lái)。

上傳圖片并生成全景圖
原理很簡(jiǎn)單,將圖片上傳到服務(wù)器,然后將服務(wù)器的圖片通過(guò)Krpano軟件生成全景圖,并將生成后的圖片轉(zhuǎn)移到統(tǒng)一的目錄中。

在開(kāi)始上傳圖片前,需要修改Krpano的配置文件Krpano/templates/normal.config如下:

# krpano 1.19

# 引入基本設(shè)置
include basicsettings.config
# 全景圖類型 自動(dòng) 如果可以識(shí)別自動(dòng),不能識(shí)別圖片會(huì)詢問(wèn)處理方法
panotype=autodetect
hfov=360

# 輸出設(shè)置
flash=true
html5=true

# convert spherical/cylindrical to cubical
converttocube=true
converttocubelimit=360x45

# multiresolution settings
multires=true
maxsize=8000
maxcubesize=2048

# 輸出圖片路徑
tilepath=%INPUTPATH%/pano/%BASENAME%.tbs-pano/3d-pano-[c].jpg

# 輸出預(yù)覽圖圖片設(shè)置
preview=true
graypreview=false
previewsmooth=25
previewpath=%INPUTPATH%/pano/%BASENAME%.tbs-pano/3d-pano-preview.jpg

# 輸出縮略圖圖片設(shè)置
makethumb=true
thumbsize=240
thumbpath=%INPUTPATH%/pano/%BASENAME%.tbs-pano/3d-pano-thumb.jpg

上傳接口代碼如下:

public function upload_3d_pic()
{
    $file = $_FILES["imgUpload"];
    $u_name =$file["name"];
    $u_temp_name =$file["tmp_name"];
    $u_size =$file["size"];
    
    // 生成 一個(gè)隨機(jī)字符串
    $str = null;
    $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123tbs456789abcdefghijklmnopqrstuvwxyz";
    $max = strlen($strPol)-1;
    for($i=0;$i<$length;$i++){
        $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max兩個(gè)數(shù)之間的一個(gè)隨機(jī)整數(shù)
    }
    
    //$md5Code 會(huì)做為文件夾的名字 跟文件的名字,要保持唯一性
    $md5Code =md5_16bit(hash("sha256",$u_name.time().$rand_char)).$str;
    $datePath =date("Y-m-d",time());

    $root_path ="./upload_3dpic/";
    $url_path ="/upload_3dpic/";    //外部訪問(wèn)url
    $f_up_to_path =$root_path ."/". $datePath."/".$md5Code;
    if(!file_exists($f_up_to_path)){
        mkdir($f_up_to_path, 0777, true);
    }
    $type = strtolower(substr($u_name, strrpos($u_name, ".") + 1));
    $img_file_name =$md5Code."." . $type;

    $saveFileName = $f_up_to_path."." . $type;
    $true_img_url =$url_path . $datePath."/".$md5Code."." . $type; //外部訪問(wèn)鏈接
    if (!move_uploaded_file($u_temp_name, $saveFileName)) {
        $this->ajaxReturn(array("error_code"=>250,"msg"=>"圖片上傳失敗,請(qǐng)稍后重試!","return"=>"move pic fail>>temp_name=".$u_temp_name.">>save file name=".$saveFileName));
    } else {
        @rmdir($f_up_to_path);
    }

    //判斷文件是否存在
    if(file_exists($saveFileName)){
        //如果存在 則生成 全景圖
        $this->create_pano_pic($saveFileName);
        // 如果 此時(shí)沒(méi)有生成圖片 需要?jiǎng)h除上傳圖片并報(bào)錯(cuò) 平面圖可能生成不了圖片
        $dirName = dirname($saveFileName) . "/pano" . "/" . $md5Code . ".tbs-pano";
        if ( !file_exists($dirName) ) {
            unlink($saveFileName); // 刪除文件
            $this->ajaxReturn(array("error_code"=>250,"msg"=>"上傳圖片不能生成全景圖"));
        }

        //移動(dòng)全景圖到指定的目錄 圖片在哪里全景圖將會(huì)生成在那個(gè)目錄
        $mvres = $this->mv_to_pano_path($saveFileName,$img_file_name);
        if ( $mvres === false ) {
            $this->ajaxReturn(array("error_code"=>250,"msg"=>"移動(dòng)文件失敗"));
        }
    }else{

        $this->ajaxReturn(array("error_code"=>250,"msg"=>"img not exists!","img_url"=>$true_img_url));
    }
    // 移動(dòng)后的縮略圖路徑
    $thumb_url = $url_path . "TreeDPic/" . $md5Code . "/pano/" . $md5Code . ".tbs-pano/3d-pano-thumb.jpg";
    $this->ajaxReturn(array(
        "error_code"=>0,
        "msg"=>"sucess",
        "img_url"=>$true_img_url,
        "pano_name"=>$md5Code,
        "thumb_url"=>$thumb_url)
     );
}

/***
* @param string $img_path
* @return string
* 將當(dāng)前傳入的圖片 渲染成為全景圖
*/
private function create_pano_pic($img_path="")
{
    if(empty($img_path)){
        return $img_path;
    }
    if(!file_exists($img_path)){
        return "圖片不存在!";
    }
    //軟件注冊(cè)碼
    $r_code ="Krpano的注冊(cè)碼";

    $pano_path=C("KRPANO_PATH"); //krpano 路徑 自己配置

    $pano_tools ="krpanotools";

    //krpano 生成圖片的命令
    $dealFlat = ""; // 處理 非球面圖
    if(PHP_OS == "WINNT"){
        $pano_path=$pano_path."Win";
        $pano_tools ="krpanotools32.exe";
    } else {
        // 上傳平面圖時(shí) 直接跳過(guò)圖片生成 否則會(huì)一直等待
        $dealFlat = "echo -e "0
" | "; 
    }
    
    $kr_command = $dealFlat . $pano_path . "/".$pano_tools." makepano -config=" . $pano_path . "/templates/normal.config ";

    try{
        //在生成圖片之前 先注冊(cè)一下碼,要不生成的全景圖會(huì)有水印
        exec( $pano_path . "/".$pano_tools." register " .$r_code);
        $kr_command =$kr_command.$img_path;
        //執(zhí)行生成圖片命令
        exec($kr_command, $log, $status);
    } catch (Exception $e){
        $this->ajaxCallMsg(250,$e->getMessage());
    }
    return true;
}

/**
* @param $pano_img_path
* @return string
* 全景圖生成后再調(diào)用這個(gè)方法,把全景圖移到對(duì)應(yīng)的目錄供 xml 文件獲取內(nèi)容
*/
private function mv_to_pano_path($pano_img_path,$img_name){
    $ig_name =explode(".",$img_name)[0];
    $root_path = "./upload_3dpic/";

    if(!file_exists($pano_img_path) ||empty($pano_img_path)){
        $this->up_error_log($pano_img_path."》》圖片路徑文件不存在");
        return "";
    }

    $now_path =dirname($pano_img_path);//獲取當(dāng)前文件目錄

    if ($dh = @opendir($now_path)){
        //打開(kāi)目錄
        while (($file = readdir($dh)) !== false){
            //循環(huán)獲取目錄的 文件
            if (($file != ".") && ($file != "..")) {
                //如果文件不是.. 或 . 則就是真實(shí)的文件
                if($file=="pano"){
                    //全景圖切片目錄
                    $t_d_path =$root_path ."TreeDPic/". $ig_name;

                    if(!file_exists($t_d_path)){
                        //不存在就創(chuàng)建
                        @mkdir($t_d_path, 0777, true);
                    }
                    if(file_exists($t_d_path."/".$file)){
                        //判斷是否已經(jīng)存在 當(dāng)前名字的  全景圖 文件
                        return false;
                    }else{
                        //否則就 把 當(dāng)前上傳的生成 的全景文件切片,移動(dòng)到指定的目錄
                        rename($now_path."/".$file,$t_d_path."/".$file);
                    }
                }else if ($file !==$img_name){
                    //刪除不是 原圖片的文件
                    if(is_dir($file)){
                        $this->deleteDir($now_path."/".$file);
                    }else{
                        @unlink($now_path."/".$file);
                    }
                }else{
                    return false;
                }
            }
        }
        closedir($dh);
    }else{
        return false;
    }

}
/**
* @param $dir
* @return bool
* 刪除文件夾及文件
*/
private  function deleteDir($dir)
{
    if (!$handle = @opendir($dir)) {
        return false;
    }
    while (false !== ($file = readdir($handle))) {
        if ($file !== "." && $file !== "..") {       //排除當(dāng)前目錄與父級(jí)目錄
            $file = $dir . "/" . $file;
            if (is_dir($file)) {
                $this->deleteDir($file);
            } else {
                @unlink($file);
            }
        }
    }
    @rmdir($dir);
}

此時(shí),我們已經(jīng)可以通過(guò)上傳接口上傳圖片并通過(guò)Krpano渲染圖片為全景圖了。

顯示全景圖
要將圖片顯示出來(lái),我們必須按照Krpano規(guī)則生成必須的xml配置文件。

我們將根據(jù)上傳圖片是生成的唯一碼作為依據(jù)生成全景圖。

// 解析XML文件
public function panorama_xml(){
    $code =I("code");
    $cutNum =intval(I("cutNum"));
    $url_path = "/upload_3dpic/";   
    // 切割模式分為 6圖 和 12圖
    if(!in_array($cutNum,array(6,12))){
        $this->error();
    }
    $this->echoSixXml($url_path,$code);
}

private function echoSixXml($url_path,$code=""){
    echo "
            
             

            
            

            
            
    
            
        
                
        
                
        
                
                    
                
            
            

            
                
            

        ";
    }

其中scene并不會(huì)當(dāng)前的效果圖渲染出來(lái),而是在我們?cè)诙鄰埲皥D之間進(jìn)行選擇的時(shí)候通過(guò)DOM.call("toggle_item_hotspots();");自動(dòng)觸發(fā)。

設(shè)置顯示頁(yè)面的路由及方法:

public function panorama(){

    //先 獲取id (md5值)
    $code =trim(I("code"));
    //圖片切割方式  6圖(采集的是6圖) 和12圖(比較復(fù)雜建議生成圖片 用6圖 配置切割)
    $cutNum =intval(I("cutNum"));
    $this->assign("codeVal",$code);
    $this->assign("cutNum",$cutNum);

    $this->display();
}

相應(yīng)的視圖文件中:




    土撥鼠全景漫游圖 - {$pageData.title}
    
    
    
    
    
    
    
    



    
加載中

修改相應(yīng)的靜態(tài)資源文件的路徑以適應(yīng)自己的項(xiàng)目,此時(shí)已經(jīng)可以看到我們的全景圖了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31812.html

相關(guān)文章

  • 使用 krpano 實(shí)現(xiàn)全景視頻

    摘要:下載,我使用的版本是最新的解壓下載文件,就是官方提供全景視頻,將整個(gè)目錄放入服務(wù)中,直接訪問(wèn)就可以預(yù)覽了。 使用 krpano 制作全景視頻 krpano的強(qiáng)大我就不多說(shuō)了,了解過(guò)的人應(yīng)該都知道,現(xiàn)在市場(chǎng)上只要應(yīng)用全景的幾乎都是使用的krp來(lái)實(shí)現(xiàn),krp官方提供了插件,全景視頻使用的是 videoplayer 插件,使用全景攝像機(jī)錄制視頻,在將他們播放到網(wǎng)頁(yè)上,可以操作鼠標(biāo)改變視角,也...

    陸斌 評(píng)論0 收藏0
  • CSS 3D Panorama(全景) - 淘寶造物節(jié)技術(shù)剖析

    摘要:淘寶造物節(jié)的活動(dòng)頁(yè)就是全景的一個(gè)很贊的頁(yè)面,它將全景圖分割成等份,相鄰的元素構(gòu)成的夾角,相鄰兩側(cè)面相對(duì)于棱柱中心所構(gòu)成的夾角。 本文轉(zhuǎn)自凹凸實(shí)驗(yàn)室:https://aotu.io/notes/2016/08... showImg(https://segmentfault.com/img/remote/1460000011381045); 前言 3D 全景并不是什么新鮮事物了,但以前...

    LiuRhoRamen 評(píng)論0 收藏0
  • krpano各種Objects

    摘要:在定義時(shí)的方法中的第三個(gè)參數(shù),實(shí)際上是文件中元素的內(nèi)部呈現(xiàn)。但是除了元素的各種屬性意外,還有幾個(gè)特殊的屬性和方法在定義時(shí),其中一個(gè)接口中的第一個(gè)參數(shù),是內(nèi)部訪問(wèn)的直接媒介接口對(duì)象。數(shù)組中的元素也是繼承與,并且額外提供了和屬性。 krpano中有好多object,krpano Plugin Interface, krpano Plugin Object, krpano Base Obje...

    n7then 評(píng)論0 收藏0
  • Android三種姿勢(shì)帶你玩轉(zhuǎn)360度全景功能

    摘要:注冊(cè)陀螺儀傳感器首先注冊(cè)陀螺儀傳感器根據(jù)具體需要自己設(shè)置靈敏度,當(dāng)然越靈敏,越耗電。注冊(cè)陀螺儀傳感器,并設(shè)定傳感器向應(yīng)用中輸出的時(shí)間間隔類型是微秒微秒最快。 簡(jiǎn)介 大家好我是張鵬輝(道長(zhǎng))人如其名,我是天橋上算命的,轉(zhuǎn)發(fā)這條博文,接下來(lái)一個(gè)月會(huì)有意想不到的驚喜發(fā)生。最近微博上的全景圖火了,所以決定實(shí)現(xiàn)一下。 工程里面圖片資源來(lái)自網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系我,馬上刪除當(dāng)然實(shí)現(xiàn)的方式很多比如Op...

    seal_de 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<