I have some messy code, even i use SimpleImage, i know i can use CodeIgniter image class, but config is little big, can someone post a little elegant and better solution, this is my code for now, i want to get rid of SimpleImage, and image class is initialized in controller.Here is what i have:
// Main config
$config['image_library'] = 'gd2';
$config['maintain_ratio'] = TRUE;
$config['height'] = '1';
$config['master_dim'] = 'width';
$config['overwrite'] = TRUE;
// Resize image with SimpleImage
$novaslika="img/proizvodi/".$last.".jpg";
$image = new SimpleImage();
$image->load($_FILES['slika']['tmp_name']);
$image->resizeToWidth(800);
$image->save($novaslika);
// Create PNG
$config['source_image'] = $_FILES['maska']['tmp_name'];
$config['width'] = 800;
$config['new_image'] = "./img/proizvodi/".$last."_maska.png";
$this->image_lib->initialize($config);
$this->image_lib->resize();
// Create thumb
$config['source_image'] = './img/proizvodi/'.$last.'.jpg';
$config['create_thumb'] = TRUE;
$config['new_image'] = './img/proizvodi/thumbs/'.$last.'_thumb.jpg';
$this->image_lib->initialize($config);
$this->image_lib->resize();
You can do something like this:
function index()
{
$this->load->library('image_lib');
$a = array(
'source_image' => 'images/1.jpg',
'width' => 100,
'height' => 100,
'new_image' => 'images/2.jpg',
'create_thumb' => TRUE,
'overwrite' => FALSE
);
$image = $this->_image_manipulation($a);
if($image === TRUE)
{
echo "IMAGE OK";
}
else
{
echo $image;
}
}
private function _image_manipulation($configs = '')
{
if($configs)
{
$config['image_library'] = 'gd2'; //static
$config['maintain_ratio'] = TRUE; //static
$config['master_dim'] = 'width'; //static
$config['source_image'] = $configs['source_image'];//required
$config['height'] = (isset($configs['height']))?$configs['height']:NULL;
$config['width'] = (isset($configs['width']))?$configs['width']:NULL;
$config['overwrite'] = (isset($configs['overwrite']))?$configs['overwrite']:NULL;
$config['new_image'] = (isset($configs['new_image']))?$configs['new_image']:NULL;
$config['create_thumb'] = (isset($configs['create_thumb']))?$configs['create_thumb']:NULL;
$this->image_lib->initialize($config);
if ( ! $this->image_lib->resize())
{
return $this->image_lib->display_errors();
}
else
{
return TRUE;
}
}
}
But will still need the SimpleImage library to convert to png's UNLESS, and I can't confirm, SimpleImage is using ImageMagick. If it is, that means it's installed on the system and you can change
$config['image_library'] = 'gd2';
to
$config['image_library'] = 'ImageMagick';
and CodeIgniter will handle the image conversion for you too; all you need to do is rename the file:
$a = array(
'source_image' => 'images/1.jpg',
'new_image' => 'images/1.png',
);
Related
Here is my controller function, please help me to create the thumbs of both images. Only the images are uploaded to the folder. i created a function named resize to create the thumbs. that's also given in the controller.
public function add() {
$this->load->helper(array('form', 'url'));
$this->load->helper('file');
$this->load->library('form_validation');
$this->form_validation->set_rules('txtPrdname', 'Product Name', 'trim|required|htmlspecialchars');
$this->form_validation->set_rules('sbPrdcategory', 'Product Category', 'trim|required|htmlspecialchars');
$this->form_validation->set_rules('sbPrduser', 'Managing User', 'trim|required|htmlspecialchars');
$this->form_validation->set_rules('txtPrdprofile', 'Product Profile', 'trim|required|htmlspecialchars');
if ($this->form_validation->run() == FALSE) {
$data_view["error"] = "";
$this->load->view('moderator/templates/header');
$this->load->view('moderator/templates/sidebar');
$this->load->view('moderator/b2bproduct_add', $data_view);
$this->load->view('moderator/templates/footer');
} else {
// Image uploading codes
$config['upload_path'] = 'assets/images/b2bproduct';
$config['allowed_types'] = 'gif|jpg|jpeg|png';
$config['max_size'] = '1000';
$config['max_width'] = '2024';
$config['max_height'] = '1768';
$config['overwrite'] = TRUE;
$config['remove_spaces'] = TRUE;
if (isset($_FILES['filePrdimage']['name'])) {
$config['file_name'] = substr(md5(time()), 0, 28) . $_FILES['filePrdimage']['name'];
}
$this->load->library('upload');
$this->upload->initialize($config);
if (!$this->upload->do_upload('filePrdimage')) {
//no file uploaded or failed upload
$error = array('error' => $this->upload->display_errors());
} else {
$dat = array('upload_data' => $this->upload->data());
$this->load->library('upload');
$this->upload->initialize($config);
$this->resize($dat['upload_data']['full_path'], 'assets/images/b2bproduct/thump/' . $dat['upload_data']['file_name'], 180, 400);
}
if (empty($dat['upload_data']['file_name'])) {
$prdimage = '';
} else {
$prdimage = $dat['upload_data']['file_name'];
}
// End Image uploading Codes
// Logo uploading codes
$config['upload_path'] = 'assets/images/b2blogo';
$config['allowed_types'] = 'gif|jpg|jpeg|png';
$config['max_size'] = '1000';
$config['max_width'] = '2024';
$config['max_height'] = '1768';
$config['overwrite'] = TRUE;
$config['remove_spaces'] = TRUE;
if (isset($_FILES['filePrdlogo']['name'])) {
$config['file_name'] = substr(md5(time()), 0, 28) . $_FILES['filePrdlogo']['name'];
}
$this->load->library('upload');
$this->upload->initialize($config);
if (!$this->upload->do_upload('filePrdlogo')) {
//no file uploaded or failed upload
$error = array('error' => $this->upload->display_errors());
} else {
$dat1 = array('upload_data' => $this->upload->data());
$this->load->library("upload",$config);
$this->resize($dat1['upload_data']['full_path'], 'assets/images/b2blogo/thump/' . $dat1['upload_data']['file_name'], 180, 400);
}
if (empty($dat1['upload_data']['file_name'])) {
$prdlogo = '';
} else {
$prdlogo = $dat1['upload_data']['file_name'];
}
// End Logo uploading Codes
$data = array(
'prd_name' => $this->input->post('txtPrdname'),
'prd_category' => $this->input->post('sbPrdcategory'),
'prd_user' => $this->input->post('sbPrduser'),
'prd_profile' => $this->input->post('txtPrdprofile'),
'prd_oem' => $this->input->post('rbtnPrdoem'),
'prd_protype' => $this->input->post('rbtnPrdprotype'),
'prd_image' => $prdimage,
'prd_ranktype' => $this->input->post('sbPrdranktype'),
'prd_points' => $this->input->post('txtPrdpoints'),
'prd_extrakey' => $this->input->post('txtPrdextrakey'),
'prd_dated' => time(),
'prd_ipadd' => $_SERVER['REMOTE_ADDR']
);
$result_id = $this->b2bproduct_model->add($data);
if ($result_id) {
redirect(base_url() . 'moderator/b2bproduct/view/' . $result_id, 'refresh');
} else {
$data_view["error"] = "Data can't insert due to database error";
$this->load->view('moderator/templates/header');
$this->load->view('moderator/templates/sidebar');
$this->load->view('moderator/b2bproduct_add', $data_view);
$this->load->view('moderator/templates/footer');
}
}
}
Resize function
public function resize($source, $destination, $width, $height) {
$config['image_library'] = 'gd2';
$config['source_image'] = $source;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = $width;
$config['height'] = $height;
$config['new_image'] = $destination;
$this->load->library('image_lib', $config);
$this->image_lib->resize();
}
First of all you are loading library two times in your function add please load it one time probably at the top of function.
in resize use $this->image_lib->initialize($config) as below
public function resize($source, $destination, $width, $height) {
$config['image_library'] = 'gd2';
$config['source_image'] = $source;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = $width;
$config['height'] = $height;
$config['new_image'] = $destination;
$this->load->library('image_lib');
$this->image_lib->initialize($config);
$this->image_lib->resize();
}
Is it possible that the folders for your thumbs (assets/images/b2bproduct/thump/ and assets/images/b2blogo/thump/) do not exist?
It is very likely the reason to be a simple spelling mistake like thump instead of thumb.
EDIT:
You really don't have to load the upload and image_lib libraries so many times. Do it once at the beginning. After that you can use $this->upload->initialize($config); or $this->image_lib->initialize($config); to all these places where now you are trying to re-load the libraries.
To make your code works you should at least add $this->image_lib->initialize($config); before $this->image_lib->resize(); in your resize function.
I'm trying to resize pre-uploaded images and then send them to another server with FTP, but it doesnt seems to be working. The uploading is working fine, the ftp is working fine too but whenever I download the image and check the size it's just the same as the uploaded file.
This is my controller:
if ($this->upload->do_upload())
{
$data = $this->upload->data();
$image = $data['file_name'];
$this->load->library('image_lib');
$config['image_library'] = 'gd2';
$config['source_image'] = './uploads/devices/'.$image;
$config['maintain_ratio'] = TRUE;
$config['width'] = 400;
$config['height'] = 300;
$this->load->library('image_lib', $config);
$this->image_lib->resize();
$localPath = './uploads/devices/'.$image;
$remotePath = 'webspace/httpdocs/uploads/devices/'.$image;
$this->load->library('ftp');
$config['hostname'] = '';
$config['username'] = '';
$config['password'] = '';
$config['port'] = 21;
$config['passive'] = TRUE;
$this->ftp->connect($config);
$this->ftp->upload($localPath, $remotePath);
$this->ftp->close();
}
What I want to achieve is upload the image, resize and replace it and upload the resized image after that.
Help is very much appreciated!
Final Edit:
Used initialize to pass the configs instead of passing them directly to load->library:
if ($this->upload->do_upload())
{
$data = $this->upload->data();
$image = $data['file_name'];
$config['image_library'] = 'gd2';
$config['source_image'] = './uploads/devices/'.$image;
$config['maintain_ratio'] = TRUE;
$config['width'] = 400;
$config['height'] = 300;
$this->load->library('image_lib');
$this->image_lib->initialize($config);
$this->image_lib->resize();
$localPath = './uploads/devices/'.$image;
$remotePath = 'webspace/httpdocs/uploads/devices/'.$image;
$this->load->library('ftp');
$config['hostname'] = '';
$config['username'] = '';
$config['password'] = '';
$config['port'] = 21;
$config['passive'] = TRUE;
$this->ftp->connect($config);
$this->ftp->upload($localPath, $remotePath);
$this->ftp->close();
}
I'm uplaoding multiple images with CI, they do upload. I am also trying to resize them,
with the following code, only the first image resizes, rest of them don't. They get uploaded with their current size.
What's wrong?
Any help'd be really, really appreciated.
function doupload() {
$path = array();
$count = count($_FILES['userfile']['size']);
foreach($_FILES as $key=>$value){
for($n=0; $n<=$count-1; $n++) {
$_FILES['userfile']['name']=$value['name'][$n];
$_FILES['userfile']['type'] = $value['type'][$n];
$_FILES['userfile']['tmp_name'] = $value['tmp_name'][$n];
$_FILES['userfile']['error'] = $value['error'][$n];
$_FILES['userfile']['size'] = $value['size'][$n];
$config['upload_path'] = './images';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$this->load->library('upload', $config);
$this->upload->do_upload();
$data = $this->upload->data();
$path[] = $data['full_path']; //contains full path of every image
}
}
foreach($path as $p=>$ath){
$config1 = array(
'source_image' => $ath,
'new_image' => './images',
'maintain_ration' => true,
'overwrite' => true,
'width' => 600,
'height' => 400
);
$this->load->library('image_lib', $config1);
$this->image_lib->resize();
$this->image_lib->clear();
}
}
first load image_lib outside loop you can use initialize in loop and pass new config for every image
$this->load->library('image_lib');
foreach($path as $p=>$ath){
$config1 = array(
'source_image' => $ath,
'new_image' => './images',
'maintain_ration' => true,
'overwrite' => true,
'width' => 600,
'height' => 400
);
$this->image_lib->initialize($config);
$this->image_lib->resize();
$this->image_lib->clear();
}
CodeIgniter's Loader class loads libraries only once, so in your foreach you resize the same image multiple times. Move the library loading out of the loop and use the initialize method of Image Manipulation library to set the config for every resize.
in my case load lib in constructor and use code
$config['image_library'] = 'gd2';
$config['maintain_ratio'] = FALSE;
$config['source_image'] = $config['upload_path'].$image_info['file_name'];
$config['new_image'] = $config['upload_path']."thumb_".$image_info['file_name'];
$config['width'] = 313;
$config['height'] = 303;
$this->image_lib->initialize($config);
$this->image_lib->resize();
$this->image_lib->clear();
$config['new_image'] = $config['upload_path']."icon_".$image_info['file_name'];
$config['width'] = 70;
$config['height'] = 70;
$this->image_lib->initialize($config);
$this->image_lib->resize();
$this->image_lib->clear();
keep index name always new_image in $config['new_image']
Hi I was wondering if you could help me, basically I am using Codeigniter and I want to be able to upload an image and save it to three different folders as three different sizes, however, they must fit the exact dimensions I specify without looking stretched or distorted.
This is my controller - if you could help me I would be most grateful.
$config['upload_path'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/original/';
$config['allowed_types'] = 'gif|jpg|png|bmp|jpeg';
$this->load->library('upload');
$this->upload->initialize($config);
if(!$this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('submit', $error);
}
else {
$data['upload_data'] = array('upload_data' => $this->upload->data());
$file_name = $this->upload->file_name;
list($image_width, $image_height) = getimagesize($_SERVER['DOCUMENT_ROOT'].'/website/uploads/original/'.$file_name);
// create small size
$config['image_library'] = 'GD2';
$config['source_image'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/original/'.$file_name;
$config['new_image'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/small/'.$file_name;
$config['maintain_ratio'] = TRUE;
$config['width'] = 181;
$config['height'] = 115;
$config['master_dim'] = 'width';
$this->load->library('image_lib');
$this->image_lib->initialize($config);
if($image_width >= $config['width'] AND $image_height >= $config['height'])
{
if (!$this->image_lib->resize())
{
echo $this->image_lib->display_errors();
} else {
if(file_exists($_SERVER['DOCUMENT_ROOT'].'/website/uploads/small/'.$file_name))
{
list($image_width, $image_height) = getimagesize($_SERVER['DOCUMENT_ROOT'].'/website/uploads/small/'.$file_name);
if($image_height > '115')
{
$config['source_image'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/small/'.$file_name;
$y_axis = $image_height - 115;
$config['y_axis'] = $y_axis;
$config['x_axis'] = 181;
$this->image_lib->initialize($config);
if (!$this->image_lib->crop())
{
echo $this->image_lib->display_errors();
} else {
echo "cropped";
}
}
}
}
}
I'm not sure if you were having trouble getting the actual image sizer library to work, or whether you just want to know how to save to three different places with different sizes... assuming you want to do the latter, you probably want to just create a function that does the image sizing stuff for you and then pass in the different height/width/name of directory/etc. that you want... Haven't tested it but it would look something like this:
function your_function() {
$this->upload->initialize($config);
$this->load->library('upload');
$this->load->library('image_lib');
if(!$this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('submit', $error);
}
else
{
$data['upload_data'] = array('upload_data' => $this->upload->data());
$file_name = $this->upload->file_name;
list($image_width, $image_height) = getimagesize($_SERVER['DOCUMENT_ROOT'].'/website/uploads/original/'.$file_name);
$this->image_resize('115', '181', 'small', $file_name, $image_width, $image_height);
$this->image_resize('300', '400', 'medium', $file_name, $image_width, $image_height);
$this->image_resize('600', '500', 'large', $file_name, $image_width, $image_height);
}
}
private function image_resize($height, $width, $path, $file_name, $image_width, $image_height)
{
// Resize image settings
$config['image_library'] = 'GD2';
$config['source_image'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/original/'.$file_name;
$config['new_image'] = $_SERVER['DOCUMENT_ROOT']."/website/uploads/$path/$file_name";
$config['maintain_ratio'] = TRUE;
$config['width'] = $width;
$config['height'] = $height;
$config['master_dim'] = 'width';
$this->image_lib->initialize($config);
if($image_width >= $config['width'] AND $image_height >= $config['height'])
{
if (!$this->image_lib->resize())
{
echo $this->image_lib->display_errors();
} else {
if(file_exists($_SERVER['DOCUMENT_ROOT']."/website/uploads/$path/$file_name"))
{
list($image_width, $image_height) = getimagesize($_SERVER['DOCUMENT_ROOT']."/website/uploads/$path$file_name");
if($image_height > '115')
{
$config['source_image'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/small/'.$file_name;
$y_axis = $image_height - 115;
$config['y_axis'] = $y_axis;
$config['x_axis'] = 181;
$this->image_lib->initialize($config);
if (!$this->image_lib->crop()){
echo $this->image_lib->display_errors();
} else {
echo "cropped";
}
}
}
}
}
}
When I crop an image it turns completely black?? Why??
$config['upload_path'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/original/'; $config['allowed_types'] = 'gif|jpg|png|bmp|jpeg';
$this->load->library('upload'); $this->upload->initialize($config);
if(!$this->upload->do_upload()) { $error = array('error' => $this->upload->display_errors()); $this->load->view('submit', $error); } else { $data['upload_data'] = array('upload_data' => $this->upload->data()); $file_name
= $this->upload->file_name;
list($image_width, $image_height) = getimagesize($_SERVER['DOCUMENT_ROOT'].'/website/uploads/original/'.$file_name);
// create small size $config['image_library'] = 'GD2'; $config['source_image'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/original/'.$file_name; $config['new_image'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/small/'.$file_name; $config['maintain_ratio'] = TRUE; $config['width'] = 181; $config['height'] = 115; $config['master_dim'] = 'width';
$this->load->library('image_lib'); $this->image_lib->initialize($config);
if($image_width >= $config['width'] AND $image_height >= $config['height']) {
if (!$this->image_lib->resize())
{
echo $this->image_lib->display_errors();
} else {
if(file_exists($_SERVER['DOCUMENT_ROOT'].'/website/uploads/small/'.$file_name))
{
list($image_width, $image_height) = getimagesize($_SERVER['DOCUMENT_ROOT'].'/website/uploads/small/'.$file_name);
if($image_height > '115')
{
$config['source_image'] = $_SERVER['DOCUMENT_ROOT'].'/website/uploads/small/'.$file_name;
$y_axis = $image_height - 115;
$config['y_axis'] = $y_axis;
$config['x_axis'] = 181;
$this->image_lib->initialize($config);
if (!$this->image_lib->crop())
{
echo $this->image_lib->display_errors();
} else {
echo "cropped";
}
}
} } }
I believe CI uses the standard PHP GD module. Previously I've found that if the image you're using is slightly corrupt it will still display normally but once you resize you simply get a black box.
Have you tried using any other images? Images of different types (png/jpg/etc)?