K-N
K-N

Reputation: 15

I am getting black background image while uploading png image with trransperent

I am getting black background image while uploading png image with transparent.Can u help me My code is pasted here

$temp_image_path = $_FILES['img_recipe']['tmp_name'];
$temp_image_name = $_FILES['img_recipe']['name'];

$img_arr = getimagesize( $temp_image_path );
$ext = '';

switch($img_arr['mime'])
{
case 'image/gif': $ext = 'gif';  break;

case 'image/png': $ext = 'png';  break;

case 'image/jpeg': $ext = 'jpg'; break;

case 'image/pjpeg': $ext = 'jpg'; break;

case 'image/x-png': $ext = 'png'; break;

default: return false;
}

$temp_image_name = genToken( $len = 32, $md5 = true );
$temp_image_name .= "." . $ext;

$uploaded_image_path = UPLOADED_IMAGE_DESTINATION . $temp_image_name;

move_uploaded_file( $temp_image_path, $uploaded_image_path );

$recipe_image_path = RECIPE_IMAGE_DESTINATION . $temp_image_name;
$recipe_thumb_image_path = RECIPE_THUMB_IMAGE_DESTINATION . $temp_image_name;

$result_recipe = generate_image_resize( $uploaded_image_path, $recipe_image_path, RECIPE_MAX_WIDTH, RECIPE_MAX_HEIGHT );
$result_recipe_thumb = generate_image_resize( $uploaded_image_path, $recipe_thumb_image_path, RECIPE_THUMB_MAX_WIDTH, RECIPE_THUMB_MAX_HEIGHT );

unlink($uploaded_image_path);

function generate_image_resize( $source_image_path, $thumbnail_image_path, $width, $height ) { list( $source_image_width, $source_image_height, $source_image_type ) = getimagesize( $source_image_path );

            switch ( $source_image_type )
            {
                case IMAGETYPE_GIF:
                $source_gd_image = imagecreatefromgif( $source_image_path );
                break;

                case IMAGETYPE_JPEG:
                $source_gd_image = imagecreatefromjpeg( $source_image_path );
                break;

                case IMAGETYPE_PNG:
                $source_gd_image = imagecreatefrompng( $source_image_path );
                break;
            }

            if ( $source_gd_image === false ){  return false;   }

            $thumbnail_image_width = $width;
            $thumbnail_image_height = $height;

            $source_aspect_ratio = $source_image_width / $source_image_height;
            $thumbnail_aspect_ratio = $thumbnail_image_width / $thumbnail_image_height;             
            if ( $source_image_width <= $thumbnail_image_width && $source_image_height <= $thumbnail_image_height )
            {   $thumbnail_image_width = $source_image_width;   $thumbnail_image_height = $source_image_height; }
            elseif ( $thumbnail_aspect_ratio > $source_aspect_ratio )
            {   $thumbnail_image_width = ( int ) ( $thumbnail_image_height * $source_aspect_ratio );    }
            else
            {   $thumbnail_image_height = ( int ) ( $thumbnail_image_width / $source_aspect_ratio );    }               
            $thumbnail_gd_image = imagecreatetruecolor( $thumbnail_image_width, $thumbnail_image_height );              
            imagecopyresampled( $thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height );                
            imagejpeg( $thumbnail_gd_image, $thumbnail_image_path, 90 );                
            imagedestroy( $source_gd_image );               
            imagedestroy( $thumbnail_gd_image );

            return true;
        }

Upvotes: 0

Views: 1236

Answers (3)

frozenfire
frozenfire

Reputation: 81

Add Image Transparency Code Between these two lines:

$thumbnail_gd_image = imagecreatetruecolor( $thumbnail_image_width, $thumbnail_image_height );

imagecopyresampled( $thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0,$thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height );

SO new code will be:

$thumbnail_gd_image = imagecreatetruecolor( $thumbnail_image_width, $thumbnail_image_height );

// preserve transparency

if($ext = 'gif' || $ext = 'png') {

imagecolortransparent($thumbnail_gd_image, imagecolorallocatealpha($thumbnail_gd_image, 0, 0, 0, 127));
imagealphablending($thumbnail_gd_image, false);
imagesavealpha($thumbnail_gd_image, true);

}

imagecopyresampled( $thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height );

Upvotes: 2

Alain
Alain

Reputation: 36944

I don't have an answer (I think @Ihson alreay gave it), but an advice.

Instead of :

switch ($img_arr['mime'])
{
    case 'image/gif': $ext = 'gif';
        break;

    case 'image/png': $ext = 'png';
        break;

    case 'image/jpeg': $ext = 'jpg';
        break;

    case 'image/pjpeg': $ext = 'jpg';
        break;

    case 'image/x-png': $ext = 'png';
        break;

    default: return false;
}

// (...)

switch ($source_image_type)
{
    case IMAGETYPE_GIF:
        $source_gd_image = imagecreatefromgif($source_image_path);
        break;

    case IMAGETYPE_JPEG:
        $source_gd_image = imagecreatefromjpeg($source_image_path);
        break;

    case IMAGETYPE_PNG:
        $source_gd_image = imagecreatefrompng($source_image_path);
        break;
}

I suggest you to use :

$string = file_get_contents($source_image_path);
$img = @imagecreatefromstring($string);
if ($img === false) {
     // something went wrong...
} else {
     // do what you want with $img
}

This is discusting to use @ operator, but in this case, there is at least 2 reasons :

  • less code to write / to test / to maintain
  • mime type may be wrong (if I rename a .jpg as a .png).

Upvotes: 0

Volkan
Volkan

Reputation: 2210

Lets call source image $si, thumbnail $ti (so long...)

Enable transparency in loaded images :

imagealphablending($si, true);

Get the original transparent color of the loaded image :

$tc = imagecolortransparent($si);

$tc = ($tc != -1)? $tc = imagecolorsforindex($si, $tc):'hopeless';

This creates a black one:

$ti = imagecreatetruecolor( $ti_width, $ti_height );

Then after creating that:

if($tc !='hopeless'){ // do we have transparent color?
     // calculate new transparent color
     $tn = imagecolorallocate( $ti, $tc['red'], $tc['green'],$tc['blue']);
     // we need it as index from now on
     $tn = imagecolortransparent( $ti, $tn );
     // fill target with transparent color
     imagefill( $ti, 0,0, $tn);
     // assign the transparent color in target
     imagecolortransparent( $ti, $tn );
}

Now a resample may change color indexes on the original image. So artefacts will exist.

imagecopyresampled($ti,$si, 0,0,0,0,$ti_width,$ti_height,$si_width,$si_height );  

Upvotes: 3

Related Questions