EllisLab text mark
Advanced Search
     
scaling PNGs with transparancy channel
Posted: 26 September 2008 06:46 AM
Joined: 2008-06-03
75 posts

scaling regular images works great, but if i try to resize PNGs with transparency channel the channel is rendered black. why?

$config = array();
          $config[‘image_library’] = ‘gd2’;
          $config[‘source_image’] = $newPath.$newfilename;
          $config[‘create_thumb’] = FALSE;
          $config[‘maintain_ratio’] = TRUE;
          $config[‘width’] = 100;
          $config[‘height’] = 50;
          $config[‘new_image’] = $thumbPath.$newfilename;
          $this->load->library(‘image_lib’, $config);
          $this->image_lib->resize();

 
Posted: 10 December 2008 11:32 AM   [ # 1 ]   [ Rating: 0 ]
Joined: 2007-07-22
2 posts

did you finally solve that?

i was searching around and the GD library version that solves that bug its still a RC

 
Posted: 11 December 2008 06:23 AM   [ # 2 ]   [ Rating: 0 ]
Joined: 2008-06-03
75 posts

i used this function, it works great!

function smart_resize_image$file$width 0$height 0$proportional false$output 'file'$delete_original true$use_linux_commands false )
    
{
        
if ( $height <= && $width <= {
            
return false;
        
}
        $info 
getimagesize($file);
        
$image '';

        
$final_width 0;
        
$final_height 0;
        list(
$width_old$height_old) = $info;

        if (
$proportional{
            
if ($width == 0$factor $height/$height_old;
            elseif (
$height == 0$factor $width/$width_old;
            else 
$factor min $width $width_old$height $height_old);  
            
$final_width round ($width_old $factor);
            
$final_height round ($height_old $factor);

        
}
        
else {       
            $final_width 
= ( $width <= ) ? $width_old $width;
            
$final_height = ( $height <= ) ? $height_old $height;
        
}

        
switch ($info[2] {
            
case IMAGETYPE_GIF:
                
$image imagecreatefromgif($file);
            break;
            case 
IMAGETYPE_JPEG:
                
$image imagecreatefromjpeg($file);
            break;
            case 
IMAGETYPE_PNG:
                
$image imagecreatefrompng($file);
            break;
            default:
                return 
false;
        
}
       
        $image_resized 
imagecreatetruecolor$final_width$final_height );
               
        if ( (
$info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG) ) {
            $trnprt_indx 
imagecolortransparent($image);
            
// If we have a specific transparent color
            
if ($trnprt_indx >= 0{
                
// Get the original image's transparent color's RGB values
                
$trnprt_color    imagecolorsforindex($image$trnprt_indx);
                
// Allocate the same color in the new image resource
                
$trnprt_indx    imagecolorallocate($image_resized$trnprt_color['red']$trnprt_color['green']$trnprt_color['blue']);
                
// Completely fill the background of the new image with allocated color.
                
imagefill($image_resized00$trnprt_indx);
                
// Set the background color for new image to transparent
                
imagecolortransparent($image_resized$trnprt_indx);
            
}
            
// Always make a transparent background color for PNGs that don't have one allocated already
            
elseif ($info[2] == IMAGETYPE_PNG{
                
// Turn off transparency blending (temporarily)
                
imagealphablending($image_resizedfalse);
                
// Create a new transparent color for image
                
$color imagecolorallocatealpha($image_resized000127);
  
                
// Completely fill the background of the new image with allocated color.
                
imagefill($image_resized00$color);
  
                
// Restore transparency blending
                
imagesavealpha($image_resizedtrue);
            
}
        }

        imagecopyresampled
($image_resized$image0000$final_width$final_height$width_old$height_old);
   
        if ( 
$delete_original {
            
if ( $use_linux_commands )
                
exec('rm '.$file);
            else
                @
unlink($file);
        
}
       
        
switch ( strtolower($output) ) {
            
case 'browser':
                
$mime image_type_to_mime_type($info[2]);
                
header("Content-type: $mime");
                
$output NULL;
            break;
            case 
'file':
                
$output $file;
            break;
            case 
'return':
                return 
$image_resized;
            break;
            default:
            break;
        
}

        
switch ($info[2] {
            
case IMAGETYPE_GIF:
                
imagegif($image_resized$output);
            break;
            case 
IMAGETYPE_JPEG:
                
imagejpeg($image_resized$output);
            break;
            case 
IMAGETYPE_PNG:
                
imagepng($image_resized$output);
            break;
            default:
                return 
false;
        
}

        
return true;
    
 
Posted: 11 December 2008 06:56 AM   [ # 3 ]   [ Rating: 0 ]
Joined: 2007-07-22
2 posts

Simply great, it works perfect!!!

Many thanks for that!

CI guys, could you integrate that functionality on the next release?

 
Posted: 25 September 2012 01:09 PM   [ # 4 ]   [ Rating: 0 ]
Joined: 2012-09-25
4 posts
stoefln - 11 December 2008 06:23 AM

i used this function, it works great!

function smart_resize_image$file$width 0$height 0$proportional false$output 'file'$delete_original true$use_linux_commands false )
    
{
        
if ( $height <= && $width <= {
            
return false;
        
}
        $info 
getimagesize($file);
        
$image '';

        
$final_width 0;
        
$final_height 0;
        list(
$width_old$height_old) = $info;

        if (
$proportional{
            
if ($width == 0$factor $height/$height_old;
            elseif (
$height == 0$factor $width/$width_old;
            else 
$factor min $width $width_old$height $height_old);  
            
$final_width round ($width_old $factor);
            
$final_height round ($height_old $factor);

        
}
        
else {       
            $final_width 
= ( $width <= ) ? $width_old $width;
            
$final_height = ( $height <= ) ? $height_old $height;
        
}

        
switch ($info[2] {
            
case IMAGETYPE_GIF:
                
$image imagecreatefromgif($file);
            break;
            case 
IMAGETYPE_JPEG:
                
$image imagecreatefromjpeg($file);
            break;
            case 
IMAGETYPE_PNG:
                
$image imagecreatefrompng($file);
            break;
            default:
                return 
false;
        
}
       
        $image_resized 
imagecreatetruecolor$final_width$final_height );
               
        if ( (
$info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG) ) {
            $trnprt_indx 
imagecolortransparent($image);
            
// If we have a specific transparent color
            
if ($trnprt_indx >= 0{
                
// Get the original image's transparent color's RGB values
                
$trnprt_color    imagecolorsforindex($image$trnprt_indx);
                
// Allocate the same color in the new image resource
                
$trnprt_indx    imagecolorallocate($image_resized$trnprt_color['red']$trnprt_color['green']$trnprt_color['blue']);
                
// Completely fill the background of the new image with allocated color.
                
imagefill($image_resized00$trnprt_indx);
                
// Set the background color for new image to transparent
                
imagecolortransparent($image_resized$trnprt_indx);
            
}
            
// Always make a transparent background color for PNGs that don't have one allocated already
            
elseif ($info[2] == IMAGETYPE_PNG{
                
// Turn off transparency blending (temporarily)
                
imagealphablending($image_resizedfalse);
                
// Create a new transparent color for image
                
$color imagecolorallocatealpha($image_resized000127);
  
                
// Completely fill the background of the new image with allocated color.
                
imagefill($image_resized00$color);
  
                
// Restore transparency blending
                
imagesavealpha($image_resizedtrue);
            
}
        }

        imagecopyresampled
($image_resized$image0000$final_width$final_height$width_old$height_old);
   
        if ( 
$delete_original {
            
if ( $use_linux_commands )
                
exec('rm '.$file);
            else
                @
unlink($file);
        
}
       
        
switch ( strtolower($output) {
            
case 'browser':
                
$mime image_type_to_mime_type($info[2]);
                
header("Content-type: $mime");
                
$output NULL;
            break;
            case 
'file':
                
$output $file;
            break;
            case 
'return':
                return 
$image_resized;
            break;
            default:
            break;
        
}

        
switch ($info[2] {
            
case IMAGETYPE_GIF:
                
imagegif($image_resized$output);
            break;
            case 
IMAGETYPE_JPEG:
                
imagejpeg($image_resized$output);
            break;
            case 
IMAGETYPE_PNG:
                
imagepng($image_resized$output);
            break;
            default:
                return 
false;
        
}

        
return true;
    

How to define the output,

$this->smartresizeimage->smart_resize_image($path_image.$data['image'],
                              
$width              450
                              
$height             0
                              
$proportional       true
                              
$output base_url()."public/image/",
                              
$delete_original    false
                              
$use_linux_commands false ); 

but I got error message

Message: imagepng() [function.imagepng]: Unable to open ‘http://localhost/project/public/image’ for writing: No such file or directory

Filename: libraries/Smartresizeimage.php

Line Number: 90

 

 
Posted: 25 September 2012 03:03 PM   [ # 5 ]   [ Rating: 0 ]
Avatar
Joined: 2009-02-19
4548 posts

did you create the public/image directory and give it write permissions?

 Signature 
 
Posted: 25 September 2012 03:05 PM   [ # 6 ]   [ Rating: 0 ]
Joined: 2012-09-25
4 posts
CroNiX - 25 September 2012 03:03 PM

did you create the public/image directory and give it write permissions?

yes of course. but any folder I try, I got same error.

 

 
Posted: 25 September 2012 03:11 PM   [ # 7 ]   [ Rating: 0 ]
Avatar
Joined: 2009-02-19
4548 posts

Your path needs to be a filesystem path, NOT a url…

 Signature 
 
Posted: 25 September 2012 03:15 PM   [ # 8 ]   [ Rating: 0 ]
Joined: 2012-09-25
4 posts
CroNiX - 25 September 2012 03:11 PM

Your path needs to be a filesystem path, NOT a url…

can you give an example. How to define a fylesystem path on this output.
because I try like this

$output base_url()."public/image/"

or

$output "./public/image/"

I still got the same error

 
Posted: 25 September 2012 03:20 PM   [ # 9 ]   [ Rating: 0 ]
Avatar
Joined: 2009-02-19
4548 posts

I usually use
FCPATH . ‘public/image/’

assuming the “public” dir is at the same level as your index.php

It produces a full path and not a relative one.

 Signature 
 
Posted: 25 September 2012 03:23 PM   [ # 10 ]   [ Rating: 0 ]
Joined: 2012-09-25
4 posts
CroNiX - 25 September 2012 03:20 PM

I usually use
FCPATH . ‘public/image/’

assuming the “public” dir is at the same level as your index.php

It produces a full path and not a relative one.

Hey, I know what is the problem.
This path need to add file_name.

$data['image']=$file['file_name'];
$output "./public/image/".$data['image']

I try like this and work.
thanks for the answer.