Изменение размера изображения на лету с помощью CodeIgniter - PullRequest
1 голос
/ 28 марта 2011

Я работаю над сценарием, который загружает файл из 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());
            }
        }

Dropbox API DownloadFile:

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

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

Ответы [ 7 ]

14 голосов
/ 13 июля 2011

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

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

до

$this->image_lib->initialize($config);
4 голосов
/ 29 апреля 2011

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

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

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

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

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

Я уже прошел через всю эту боль, поэтому я надеюсь, что это поможет вам:)

3 голосов
/ 17 августа 2016

Для многократного изменения размера ниже код работал для меня.

    $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.
0 голосов
/ 03 июля 2014

// Сделать контроллер с именем "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"/>
0 голосов
/ 16 сентября 2012

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

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

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

$file = substr($file,9);

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

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

0 голосов
/ 18 апреля 2012

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

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

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


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

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

0 голосов
/ 19 октября 2011

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

Чтение http://codeigniter.com/user_guide/libraries/image_lib.html

...