Как я могу изменить эту функцию манипуляции с изображениями, сделанную в codeigniter, чтобы быть более эффективной - PullRequest
1 голос
/ 15 января 2009

Я думаю, что эта функция не так эффективна, как должна быть. Я был бы признателен за некоторые предложения о том, как я могу структурировать его, чтобы быстрее и занимать меньше памяти Вот что делает код:

  1. проверяет, было ли загружено изображение
  2. добавить информацию об этом (теги, имя, реквизиты) в базу данных
  3. если установлена ​​переменная $ direction, поверните изображение
  4. если изображение шире 600 пикселей, измените его размер
  5. создать миниатюру

Я думаю, что неэффективность заключается в том, что шаги 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 ]

2 голосов
/ 15 января 2009

Для всей работы, необходимой для манипулирования изображениями с использованием объектов, которые предоставляет вам воспламенитель кода, вы можете захотеть сделать это самостоятельно с помощью функций gd в php. Я не использовал воспламенитель кода, но я сделал много вещей с манипуляциями с изображениями в php, и это не очень сложно.

Просто глядя на ваш код, и я предполагаю, что это способ воспламенения кода, я вижу, как вы вызываете image_lib->initialize() и load->library() для каждой отдельной манипуляции. Я бы заглянул внутрь этих методов и методов rotate() и resize(), которые вы используете, и увидел бы, создают ли они и уничтожают ли ресурсы изображения при каждой манипуляции. Если вы используете библиотеку gd, вы можете повторно использовать один и тот же ресурс изображения для каждого шага, а затем просто записать его в файл, когда будете готовы (повторно используйте этот же ресурс изображения для создания эскиза). Это, вероятно, значительно увеличит производительность как по скорости выполнения, так и по используемой памяти.

Функции GD в PHP

2 голосов
/ 28 июня 2012

Что ж, я могу ответить на часть вашего вопроса - вы можете вращать изображения с поворотом exif, используя Codeigniter .

Во-первых: Обнаружение загруженных изображений 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();
                }
            }
        }
    }
0 голосов
/ 15 января 2009

Вы можете хранить свои конфиги в другом месте в соответствии с документацией codeigniter , что увеличит код Я не знаю, как вы могли связать эти события.

...