Изменение размера изображения «На лету» с помощью CodeIgniter

#php #codeigniter #image-manipulation

#php #codeigniter #обработка изображений

Вопрос:

Я работаю над скриптом, который загружает файл из Dropbox, должен изменять размер этого изображения, а затем загружать его в корзину S3.

По какой-то причине я не могу изменить размер изображения.

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

База кода:

 public function resize_test() {
            $postcard_assets = $this->conn->getPostcardDirContent("folder_name", "Photos", TRUE);

            foreach($postcard_assets['contents'] as $asset) {
                $file = pathinfo($asset['path']);
                $original_file = $this->conn->downloadFile($asset['path']);

                $raw_file = sha1($file['basename']);
                $s3_file_name = "1_{$raw_file}.{$file['extension']}";
                $this->resize_photo($original_file);
                $this->s3->putObject($s3_file_name, $original_file, 's3-bucket-name', 'public-read');

                $s3_check = $this->s3->getObjectInfo($s3_file_name, 's3-bucket-name');

                if($s3_check['content-length'] > 0) {
                    krumo($s3_check);
                    exit();
                }
            }
        }

private function resize_photo($photo) {
            $config['image_library'] = 'imagemagick';
            $config['source_image'] = $photo;
            $config['maintain_ratio'] = TRUE;
            $config['width']     = 640;
            $config['height']   = 480;

            $this->load->library('image_lib', $config);

            if(!$this->image_lib->resize()) {
                exit($this->image_lib->display_errors());
            }
        }
  

Файл загрузки API Dropbox:

     public function downloadFile($file) {
        $this->setTokens();
        return $this->conn->getFile($file);
    }
  

Кто-нибудь знает, что я могу делать неправильно?

Комментарии:

1. Подсказка заключается в ошибке — похоже, на вашем сервере не установлен GD, который он использует для обработки изображений. Может быть, ваш хост предоставляет ImageMagick вместо этого? Это стоит проверить на их веб-сайте. Если это ваш собственный сервер, установите GD! Инструкции здесь php.net/manual/en/image.setup.php

2. ОК… Я установил imagemagick в моей среде MAMP, и он работает… но я все еще получаю ошибку Путь к изображению неверен. Сбой обработки изображения. Пожалуйста, убедитесь, что ваш сервер поддерживает выбранный протокол и что путь к вашей библиотеке изображений правильный. Я пытаюсь манипулировать загруженным изображением, поэтому я пытаюсь изменить размер изображения в процессе передачи, прежде чем перейти к S3

3. Повторите путь к изображению и посмотрите, правильный ли он? Также убедитесь, что любая используемая вами библиотека изменения размера изображения поддерживает ImageMagick, но похоже, что это не так.

4. Изображение загружается и устанавливается во временную переменную. Так что на самом деле я нигде не сохраняю изображение… Я хочу обработать изображение в пути, прежде чем отправлять его на S3

Ответ №1:

Не загружайте image_lib несколько раз. Добавьте image_lib в автозагрузку библиотек и измените

 $this->load->library('image_lib', $config);
  

Для

 $this->image_lib->initialize($config);
  

Ответ №2:

Я выполняю изменение размера изображения с помощью CI, используя ImageMagick, точно так же, как и вы. Для того, чтобы это заработало, вам нужно следующее:

  • imagemagick должен быть установлен. Вы можете протестировать его из командной строки, используя команду «Преобразовать»
  • необходимо установить imagick, это библиотека PHP, которая привязывается к imagemagick
  • Сам ImageMagick зависит от различных других библиотек, таких как libjpeg и libpng. Убедитесь, что они также установлены

Просто выполните phpinfo() и прокрутите вниз до ‘imagick’. Проверьте, есть ли оно там, а затем проверьте заголовок «поддерживаемые форматы файлов», чтобы узнать, есть ли там тип файла, размер которого вы хотите изменить.

Если все вышеперечисленное верно, но оно по-прежнему не работает, не забудьте включить в свой код путь к imagemagick:

 $config['library_path'] = '/usr/local/bin';
  

Я уже проходил через всю эту боль раньше, поэтому надеюсь, это поможет вам 🙂

Комментарии:

1. Я когда-нибудь говорил тебе, что ты мой герой?

Ответ №3:

Приведенный ниже код для многократного изменения размера сработал для меня.

     $config['create_thumb'] = FALSE; //to avoid _thumb prefixing
    $config['maintain_ratio'] = TRUE;
    $config['width'] = 250;
    $config['height'] = 250;
    $config['new_image'] = 'thumb_250x250_'.$file_name; // new name
    $CI->load->library('image_lib', $config, 'abc'); //abc to avoid instance caching.
    $CI->abc->resize();
    unset($CI->abc); //unsetting instance.
    $config['width'] = 100;
    $config['height'] = 100;
    $config['new_image'] = 'thumb_100x100_'.$file_name; // new name
    $CI->load->library('image_lib', $config, 'xyz'); // xyz to avoid instance caching.
    $CI->xyz->resize();
    unset($CI->xyz); // unsetting instance.
  

Ответ №4:

Вам нужно использовать $config['new_image'] = '/path/to/new_image.jpg'; в вашей resize_photo функции.

Читать http://codeigniter.com/user_guide/libraries/image_lib.html

Ответ №5:

На самом деле вы пытаетесь загрузить библиотеку изображений дважды. Поскольку вы также инициализируете конфигурационный массив в той же строке, массив никогда не загружается в библиотеку.

Измените свой код на этот:

     //this
    $this->load->library('image_lib', $config);


    //to this
    $this->load->library('image_lib');
    $this->image_lib->initialize($config);
  

и это будет работать идеально.

Ответ №6:

Посмотрите, сможете ли вы на самом деле открыть исходное сохраненное изображение, прежде чем пытаться изменить его размер. Я декодировал загруженное на base64 изображение, используя preg_replace. По какой-то причине, которую я до сих пор не могу отследить… это было удаление примерно так

 $file = preg_replace('/data.*base64,/', '', chunk_split($this->post('myimg'));
  

это вернет это: [удалено] /9 …. и т.д., которые при декодировании base64… очевидно, что это недопустимый файл изображения.. таким образом, изменение размера не сработало бы. Мне пришлось добавить

 $file = substr($file,9);
  

чтобы затем удалить [удалено]. дополнительная работа и мне потребовалось некоторое время, чтобы разобраться, но теперь я могу изменять размер изображений.

Побочный вопрос… Почему preg_replace добавляет [удалено]??? Вздох … php.

Ответ №7:

//Создать контроллер с именем «image.php »

 class Image extends CI_Controller {

 public function index($width, $height, $image_path)
    {   
        $config['image_library'] = 'gd2';
        $config['source_image'] = './uploads/'.$image_path;
        $config['dynamic_output'] = TRUE;
        $config['maintain_ratio'] = TRUE;
        $config['width'] = $width;
        $config['height'] = $height;

        $this->load->library('image_lib', $config); 
        $this->image_lib->initialize($config);
        echo $this->image_lib->resize();
    }
}

?>
//Call from view page
<img src="<?php echo ("index.php/image/index/150/150/".$luserdata[0]'profile_image']);?>"      alt="resized mage1"/>