Auto image detection for 360 characters in PHP

I present a page with a description of the properties as shown below (it can be accessed here ) enter image description here

I have an image slider and 360 image viewer. Currently, the user downloads both types of images manually, as well as simple images from one interface and 360 images from another interface. I check if the property has 360 images and displays them using the panorama viewer.

I use the following controller to download 360 images, which are similar to downloading simple images.

public function upload_360_images()
{
    if($this->session->userdata['id'] && $this->session->userdata['type']=='user')
    {
        if($_FILES)
        {
            if(isset($_FILES['files'])){
                $data['errors']= array();
                $extensions = array("jpeg","jpg","png");

                foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){

                    $file_name = $key.$_FILES['files']['name'][$key];
                    $file_size =$_FILES['files']['size'][$key];
                    $file_tmp =$_FILES['files']['tmp_name'][$key];
                    $file_type=$_FILES['files']['type'][$key];
                    /*$file_ext=explode('.',$_FILES['image']['name'][$key]) ;
                    $file_ext=end($file_ext);*/
                    $i=1;
                    if($file_size > 7097152){
                        $data['errors'][$i]='File '.$i.' size must be less than 7 MB';
                        $i++;
                    }

                    $desired_dir="uploads";
                    if(empty($data['errors'])==true){
                        if(is_dir($desired_dir)==false){
                            mkdir("$desired_dir", 0700);        // Create directory if it does not exist
                        }
                        if(is_dir("$desired_dir/".$file_name)==false){
                            move_uploaded_file($file_tmp,"uploads/".$file_name);
                            $this->post_model->add360Image('property_360_images',$file_name,$this->uri->segment(3));
                        }else{                                  //rename the file if another one exist
                            $new_dir="uploads/".$file_name.time();
                            rename($file_tmp,$new_dir) ;
                        }

                    }else{
                        $data['contact']=$this->admin_model->getContactDetails();
                        $data['images']=$this->post_model->getProperty360Images($this->uri->segment(3));
                        $data['title']='My Profile Image';
                        $this->load->view('site/static/head',$data);
                        $this->load->view('site/static/header');
                        $this->load->view('site/content/upload_360_images');
                        $this->load->view('site/static/footer');
                        $this->load->view('site/static/footer_links');
                    }
                }
                if(empty($data['errors']))
                {
                    redirect(base_url().'dashboard');
                }
                else
                {
                    $data['contact']=$this->admin_model->getContactDetails();
                    $data['images']=$this->post_model->getProperty360Images($this->uri->segment(3));
                    $data['title']='My Profile Image';
                    $this->load->view('site/static/head',$data);
                    $this->load->view('site/static/header');
                    $this->load->view('site/content/upload_360_images');
                    $this->load->view('site/static/footer');
                    $this->load->view('site/static/footer_links');
                }
            }

        }
        else
        {
            $data['contact']=$this->admin_model->getContactDetails();
            $data['images']=$this->post_model->getProperty360Images($this->uri->segment(3));
            $data['title']='My Profile Image';
            $this->load->view('site/static/head',$data);
            $this->load->view('site/static/header');
            $this->load->view('site/content/upload_360_images');
            $this->load->view('site/static/footer');
            $this->load->view('site/static/footer_links');
        }

    }
    else
    {
        redirect(base_url().'user/login');
    }

}

Please ignore the long code, this code is from production, so I need to put a lot of checks and conditions.

, , 360 , , / .

Stackoverflow, , EXIF, .

, , php , 360. , . , : php?

+4
2

Unity3D, , , Equidedangular 2: 1.

2000 1000 ( , ).

, , posX posY, :

//this is how much the image should be close the 2:1 proportion, or 0.5-proportionThreshold.
proportionThreshold = 0.01;

//images smaller than this should not have resolution enough to be a panorama.
//it is important here to 
minimumWidth = 2000;
minimumHeight = 1080;

//in case of the image is not a panorama, this variable determines the maximum size it could be projected
maxFill = 0.65;

//what is the amount of the view the pamorama should view:
scaleX = 1;
scaleY = 1;

//where the panorama should be positioned in the view:
posX = 0;
posY = 0;

currentWidth = source.width;
currentHeight = source.height;

if(isFullPanorama()){
    Log("Full Panorama");
    //the variables are already set for that
}else if(isPartialPanorama()){
    Log("Partial Panorama");
    scale = currentHeight/currentWidth * 2f;
    scaleX = 1;
    scaleY = scale;
    posX = 0;
    posY = 0.5-scale/2;
}else{
    Debug.Log("Not Panorama");
    proportion = currentHeight/currentWidth;
    w = currentWidth > minimumWidth*maxFill ? minimumWidth*maxFill : currentWidth;
    scaleX = w / minimumWidth / 2;
    scaleY = scaleX * proportion * 2;
    if(scaleY>1) {
        h = currentHeight > minimumHeight*maxFill ? minimumHeight*maxFill : currentHeight;
        scaleY = h / minimumHeight / 2;
        scaleX = scaleY * proportion / 2;
    }
    posX = 0.5-scaleX/2;
    posY = 0.5-scaleY/2;
}

bool isFullPanorama(){
    proportion = currentHeight/currentWidth;
    return proportion>=0.5-proportionThreshold &&
    proportion<=0.5+proportionThreshold &&
    source.height >= minimumHeight;
}

bool isPartialPanorama(){
    return currentHeight/currentWidth<=0.5 &&
    source.width >= minimumWidth;
}
+2

Facebook 360 Group:

, 360 .

, EXIF ​​

Projection Type : equirectangular

Use Panorama Viewer : True

, LG 360.

+1

Source: https://habr.com/ru/post/1670902/


All Articles