Codeigniter Trim Image - PullRequest
       1

Codeigniter Trim Image

0 голосов
/ 07 марта 2012

Я использую класс загрузки, с которым поставляется codeigniter:

$config['upload_path'] = getcwd() . '/public/images';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width']  = '1024';
$config['max_height']  = '768';
$config['encrypt_name'] = true;

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

if ( ! $this->upload->do_upload())
{
    echo $error = array('error' => $this->upload->display_errors());

}
else
{
    echo $data = array('upload_data' => $this->upload->data());
}

Он отлично работает при загрузке файла, но теперь я хотел бы обрезать все лишние пробелы на изображении. Я посмотрел на класс манипуляции с изображениями, но, похоже, он этого не делает. Поэтому я осмотрелся и нашел этот Обрезанный пробел из изображения в PHP . Я не уверен, как соединить их вместе. Есть идеи?

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Вы правы, класс манипулирования изображениями не поддерживает этого.

Однако вы можете расширить библиотеку (в нижней части http://codeigniter.com/user_guide/general/creating_libraries.html) и добавить новый метод на основе кода из ссылки, которую вы уже нашли.

Здесь мне было скучнона работе, расширьте библиотеку манипулирования изображениями CI и добавьте этот метод:

public function trim_whitespace($color = 'FFFFFF')
{
    //load the image
    $img = $this->image_create_gd();

    //find the size of the borders
    $b_top = 0;
    $b_btm = 0;
    $b_lft = 0;
    $b_rt = 0;

    //top
    for(; $b_top < imagesy($img); ++$b_top) {
        for($x = 0; $x < imagesx($img); ++$x) {
            if(imagecolorat($img, $x, $b_top) != '0x'.$color) {
                break 2; //out of the 'top' loop
            }
        }
    }

    //bottom
    for(; $b_btm < imagesy($img); ++$b_btm) {
        for($x = 0; $x < imagesx($img); ++$x) {
            if(imagecolorat($img, $x, imagesy($img) - $b_btm-1) != '0x'.$color) {
                break 2; //out of the 'bottom' loop
            }
        }
    }

    //left
    for(; $b_lft < imagesx($img); ++$b_lft) {
        for($y = 0; $y < imagesy($img); ++$y) {
            if(imagecolorat($img, $b_lft, $y) != '0x'.$color) {
                break 2; //out of the 'left' loop
            }
        }
    }

    //right
    for(; $b_rt < imagesx($img); ++$b_rt) {
        for($y = 0; $y < imagesy($img); ++$y) {
            if(imagecolorat($img, imagesx($img) - $b_rt-1, $y) != '0x'.$color) {
                break 2; //out of the 'right' loop
            }
        }
    }

    //copy the contents, excluding the border
    $newimg = imagecreatetruecolor(
    imagesx($img)-($b_lft+$b_rt), imagesy($img)-($b_top+$b_btm));

    imagecopy($newimg, $img, 0, 0, $b_lft, $b_top, imagesx($newimg), imagesy($newimg));

    //  Output the image
    if ($this->dynamic_output == TRUE)
    {
        $this->image_display_gd($newimg);
    }
    else
    {
        // Or save it
        if ( ! $this->image_save_gd($newimg))
        {
            return FALSE;
        }
    }
}

Использование:

// load extended image lib
$this->load->library('image_lib');

// configure image lib
$config['image_library'] = 'gd2';
$config['source_image']  = 'path/to/source.img';
$config['new_image']     = 'path/to/output.img';

$this->image_lib->initialize($config);
$this->image_lib->trim_whitespace('38ff7e'); // set colour to trim, defaults to white (ffffff)
$this->image_lib->clear();

Стоит отметить, что, хотя это будет работать, вы действительно не должны использовать этокак dynamic_output, выполнить обрезку при сохранении, в противном случае он просто все замедлит. Кроме того, он ищет только одно значение цвета (хотя это ограничение из кода, который вы разместили, для этого могут быть более эффективные функции)так что если это сжатый JPG, у вас могут возникнуть проблемы с получением всего пробела.

0 голосов
/ 15 августа 2017

Чтобы использовать ImageMagick, вы должны добавить функцию к image_lib.php:

public function trimimg()
    {
        $protocol =  'image_process_'.$this->image_library;     
        return $this->$protocol('trimimg');
    }

, а затем добавить к функции

public function image_process_imagemagick($action = 'resize')
    {
        // Do we have a vaild library path?     
        if ($this->library_path === '')
        {
            $this->set_error('imglib_libpath_invalid');
            return FALSE;
        }

        if ( ! preg_match('/convert$/i', $this->library_path))
        {
            $this->library_path = rtrim($this->library_path, '/').'/convert';
        }

        // Execute the command
        $cmd = $this->library_path.' -quality '.$this->quality;

        if ($action === 'crop')
        {
            $cmd .= ' -crop '.$this->width.'x'.$this->height.'+'.$this->x_axis.'+'.$this->y_axis;
        }
        elseif ($action === 'rotate')
        {
            $cmd .= ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt')
                    ? ' -flop'
                    : ' -rotate '.$this->rotation_angle;
        }
        elseif ($action === 'trimimg')
        {
            $cmd .= ' -trim';
        }

последний код.

Тогда

$this->image_lib->trimimg())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...