#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"/>