PNG, couche alpha et imagecopyresampled().

Eléphanteau du PHP | 45 Messages

13 nov. 2009, 17:12

PNG, couche alpha et imagecopyresampled().

Bonjour, bonsoir

Comment redimensionner une image png tout en conservant sa couche alpha ? Parce que là moi je sèche ? La doc de php ne précise rien du tout. J'ai bien utilisé les fonctions ImageAlphaBlending($une_image, false) suivis de imageSaveAlpha($une_image, true). Mais rien du tout...

Merci par avance !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

13 nov. 2009, 17:16

Bonjour,

Donne nous un morceau de code pour qu'on puisse regarder d'où pourrait provenir le problème.
Tu utilises bien ImageCreateTrueColor() et pas ImageCreate() par hasard?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 45 Messages

13 nov. 2009, 17:24

Non j'utilise bien ImageCreateTrueColor(),

Voilà c'est dans une class,
	/**
     * Redimensionne une image $pictures, avec proportionalité sur la hauteur $new_width, largeur $new_height
	 * ou selon une taille prédéfinie ($new_width, $new_height)
	 *
	 * @arguments 	STRING $pictures chemin d'accès à une image
	 *				INT $new_width taille en pixel de la largeur voulue
	 *				INT $new_height taille en pixel de la hauteur voulue
	 *				
	 * @return    	BOOL 0 si une erreur est survenue
	 *					 RESOURCE images
     */
	public function set_resize_pics( $pictures, $new_width = NULL, $new_height = NULL) {
		
		// Image properties
		if( !getimagesize( $pictures ) ) {
			return FALSE;
		}
		else {
			$pics_param = getimagesize( $pictures );
		}
		
		// Resize fixed width and height
		if( isset( $new_width ) && isset( $new_height ) ) {
			$width  = $new_width;
			$height = $new_height;
		}
		// Resize by new width
		elseif( isset( $new_width ) && is_null( $new_height ) ) {
			// Ratio by width
			if( $new_width > $pics_param[0] ) {
				$ratio  = $new_width / $pics_param[0] ;
				$width  = $new_width ;
				$height = round( $pics_param[1] * $ratio ) ;
			}
			else {
				$ratio  = $pics_param[0] / $new_width  ;
				$width  = $new_width ;
				$height = round( $pics_param[1] / $ratio ) ;
			}
		}
		// Resize by new height
		elseif( isset( $new_height ) && is_null( $new_width ) ) {
			// Ratio by height
			if( $new_height > $pics_param[1] ) {
				$ratio  = $new_height / $pics_param[1] ;
				$width  = round( $pics_param[0] * $ratio ) ;
				$height = $new_height ;
			}
			else {
				$ratio  = $pics_param[1] / $new_height ;
				$width  = round( $pics_param[0] / $ratio ) ;
				$height = $new_height ;
			}
		}
		
		$image_mini 		= imagecreatetruecolor( $width, $height ) ;
		ImageAlphaBlending($image_mini, false);
		ImageSaveAlpha($image_mini, true);

		$pictures_origin	= self::get_open_pics( $pictures ) ;
		
		imagecopyresampled( $image_mini, $pictures_origin, 0, 0, 0, 0, $width, $height, $pics_param[0], $pics_param[1]) ;
		
		return $image_mini;
	}
Et get_open_pics
/**
     * Ouvre une image $pictures
	 *
	 * @arguments 	STRING $pictures chemin d'accès à une image
	 * @return    	BOOL 0 si une erreur est survenuee
	 *					 RESOURCE images
     */
	public function get_open_pics( $pictures ) {
		if( !is_file($pictures) ) {
			return FALSE;
		}
		$pictures_param = self::get_properties_pics( $pictures );
		switch( $pictures_param['mime'] ) {
			case 'image/png':
				// Conserve l'alpha blending !
				$size 			  = getimagesize( $pictures ) ;
				$img_src_resource = imagecreatetruecolor($size[0], $size[1]);
				ImageAlphaBlending($img_src_resource, false);
				ImageSaveAlpha($img_src_resource, true);
				$im 			  = imagecreatefrompng($pictures);
				imagecopyresampled($img_src_resource, $im, 0,0,0,0, $size[0], $size[1], $size[0], $size[1]);
				//
				
				return $img_src_resource;
				break;
				
			case 'image/jpeg':
				$img_src_resource = imagecreatefromjpeg($pictures);
				return $img_src_resource;
				break;
			
			case 'image/gif':
				$img_src_resource = imagecreatefromgif($pictures);
				return $img_src_resource;
				break;
			
			default :
				return FALSE;
				break;
		}
	}
Vlà, thx