如何在codeigniter中修改此图像处理功能以提高效率

时间:2009-01-14 22:17:54

标签: codeigniter resize gd

我认为这个功能不如它应该有效。我很欣赏一些关于如何构建它以加快速度并减少内存的建议。这就是代码的作用:

  1. 检查图像是否已上传
  2. 将有关它的详细信息(标签,名称,详细信息)添加到数据库
  3. 如果设置了变量$ orientation,则旋转图像
  4. 如果图像宽度超过600px,请调整大小
  5. 创建缩略图
  6. 我认为效率低下来自于将步骤3,4,5全部分开。有没有办法巩固它们?谢谢!

     function insert()
      {
        $config['upload_path'] = './uploads/';
        $config['allowed_types'] = 'jpg';
        $config['max_size'] = '5000';
        $config['max_width']  = '4096';
        $config['max_height']  = '4096';
    
        $this->load->library('upload', $config);
    
        if (!$this->upload->do_upload())
        {
          $data = array('error' => $this->upload->display_errors());
    
          $data['title'] = "Add Photo | Mark The Dark";
          $this->load->view('photo_add_view', $data);
        }   
        else
        {
          //get uploaded image info
          $data = array('upload_data' => $this->upload->data());
    
          //clean the data
          $data = $this->input->xss_clean($data);
    
          //get orientation info and erase it from POST variable
          //$orientation = $_POST['orientation'];
          //unset($_POST['orientation']);
    
          //grab the tags
          $tags = $_POST['tags'];
          unset($_POST['tags']);
    
          //add in some other stuff
          $_POST['time'] = date('YmdHis');
          $_POST['author'] = $this->dx_auth->get_user_id();
    
          //insert it in the database
          $this->db->insert('photos', $_POST);
          $photo_id = $this->db->insert_id();
    
          //add stuff to tags table
          /*
          $tags_array = preg_split('/[\s,;]+/', $tags);
          foreach($tags_array as $tag)
          {
            if($tag != "" || $tag != null)
              $this->db->insert('tags', array('id' => $photo_id, 'word' => $tag));
          }*/
    
          //CXtags
          /*$tags_array = preg_split('/[\s,;]+/', $tags);
          foreach($tags_array as $tag)
          {
            if($tag == "" || $tag == null)
            {unset($tags_array[$tag]);}
          }
          */
          $tags_array = $this->CXTags->comma_to_array($tags);
          foreach($tags_array as $tag)
          {$tags_array[$tag] = $this->CXTags->make_safe_tag($tag);}
          $topass = array(
            'table' => 'photos',
            'tags' => $tags_array,
            'row_id' => $photo_id,
            'user_id' => $_POST['author']
          );
          $this->CXTags->add_tags($topass);
    
          //rename the file to the id of the record in the database
          rename("./uploads/" . $data['upload_data']['file_name'], "./uploads/" . $photo_id . ".jpg");
    
          list($width, $height, $type, $attr) = getimagesize("./uploads/" . $photo_id . '.jpg');
    
    
          if (($orientation == 1) || ($orientation == 2))
          {
            //echo $orientation;
            //rotate image
            $config['image_library'] = 'GD2';
            $config['source_image'] = './uploads/' . $photo_id . '.jpg';
            if ($orientation == 1)
            {
              $config['rotation_angle'] = 270;
            }
            elseif ($orientation == 2)
            {
              $config['rotation_angle'] = 90;
            }
            $this->load->library('image_lib', $config);
            $this->image_lib->initialize($config);
            if(!$this->image_lib->rotate())
            {
              echo $this->image_lib->display_errors();
            }
          }
    
    
          $this->load->library('image_lib');
          if ($width > 600)
          {
            //resize image
            $config['image_library'] = 'GD2';
            $config['source_image'] = './uploads/' . $photo_id . '.jpg';
            $config['new_image'] = './uploads/photos/' . $photo_id . '.jpg';
            $config['create_thumb'] = FALSE;
            $config['maintain_ratio'] = TRUE;
            $config['width'] = 600;//180
            $config['height'] = 480;
            $config['master_dim'] = 'width';
            $this->image_lib->initialize($config);
            $this->load->library('image_lib', $config);
            if(!$this->image_lib->resize())
            {
              echo $this->image_lib->display_errors();
            }
          }
          else
          {
    
            $source = './uploads/' . $photo_id . '.jpg';
            $destination = './uploads/photos/' . $photo_id . '.jpg';
            rename($source, $destination);
          /*//buggy php???
            $result = copy($source, $destination);
            echo "HO" . $result;
            */
    
          }
    
          //create thumbnail
          $config['image_library'] = 'GD2';
          $config['source_image'] = './uploads/photos/' . $photo_id . '.jpg';
          $config['new_image'] = './uploads/thumbnails/' . $photo_id . '.jpg';
          $config['create_thumb'] = TRUE;
          $config['thumb_marker'] = '_thumb';
          $config['maintain_ratio'] = TRUE;
          $config['width'] = 180;//180
          $config['height'] = 100;
          $config['master_dim'] = 'width';
          $this->image_lib->initialize($config);
          $this->load->library('image_lib', $config);
          $this->image_lib->resize();
    
          redirect('photo/show/' . $photo_id);
    
        }
    
        //redirect('photo/photo_add/');
      }
    

3 个答案:

答案 0 :(得分:2)

对于使用代码点火器为您公开的对象进行图像处理所需的所有工作,您可能希望自己严格使用php中的gd函数来完成此操作。我没有使用过代码点火器,但是我已经在php中完成了很多图像处理工作,并且它并不是非常困难。

只需查看您的代码,我假设这是代码点火方式,我看到您为每个操作调用image_lib->initialize()load->library()。我将查看这些方法以及您正在使用的rotate()resize()方法,看看它们是否在每次操作时创建和销毁图像资源。如果使用gd库,则可以为每个步骤重用相同的图像资源,然后在准备好时将其写入文件(重新使用相同的图像资源来创建缩略图)。这可能会在执行速度和使用的内存方面带来巨大的性能提升。

GD Functions in PHP

答案 1 :(得分:2)

好吧,我可以回答你的部分问题 - 你可以使用 Codeigniter 旋转带有exif轮换的图像。

<强>首先: 检测上传的图片exif数据 查看$exif数组并处理Orientation项 将所需的旋转度传递给codeigniters image_lib->rotate()函数。

EG:

public function auto_rotate_image($upload_data){//iphone rotation fix

        $path = $upload_data['full_path'];

        $exif = exif_read_data($path);
        if(isset($exif['Orientation'])){
            $rotate = false;
            switch($exif['Orientation']){//only really interested in the rotation
                case 1: // nothing
                break;
                case 2:// horizontal flip
                break;     
                case 3: // 180 rotate left
                    $rotate = 180;
                break;   
                case 4: // vertical flip
                break;
                case 5: // vertical flip + 90 rotate right
                break;
                case 6: // 90 rotate right
                    $rotate = 270;
                break;
                case 7: // horizontal flip + 90 rotate right
                break; 
                case 8: // 90 rotate left
                    $rotate = 90;
                break;
            }

            if($rotate){

                $config=array();
                $config['image_library'] = 'gd2';
                $config['source_image'] = $path;
                $config['rotation_angle'] = $rotate;
                $config['overwrite'] = TRUE;
                $this->load->library('image_lib',$config);

                if(!$this->image_lib->rotate()){
                    echo $this->image_lib->display_errors();
                }
            }
        }
    }

答案 2 :(得分:0)

您可以按照codeigniter documentation将其配置存储在其他地方,这样会收紧代码。我不知道你怎么能把这些事件联系起来。