IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Redimensionnement image: Marges transparentes


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Redimensionnement image: Marges transparentes
    Bonjour,

    Je souhaiterais pouvoir transférer des images PNG ou GIF sur mon serveur avec des dimensions spécifiques mais sans déformer l'image. Donc pour cela, il me faut émarger l'image lors du redimensionnement.

    Mon problème est que je n'arrives pas à obtenir des marges transparentes, elles sont noires

    Voici mon script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <?php
    function upload_image($filename,
    	$destination,
    	$dst_w = 0, 
    	$dst_h = 0,
    	$resample = 'basic') {
    # Uploading image
    # Get image extension
    	$type = strtolower(substr(strrchr($_FILES[$filename]['name'],"."),1));
    	if($type == 'jpeg') $type = 'jpg';
    	if (!preg_match('#^(bmp|gif|jpg|png)$#', $type)) return false;
    	# Complete destination path
    	$destination = $destination.'.'.$type;
    	$root_destination = $_SERVER["DOCUMENT_ROOT"].$destination;
    	# Create image path folders
    	@mkdir(preg_replace('#^(.*)/(.*?)$#', '$1', $root_destination), 0755, true);
    	# Save image
    	if (!move_uploaded_file($_FILES[$filename]['tmp_name'], $root_destination)) 
    		return false;
    # Resizing image
    	if ($dst_h <= 0 && $dst_w <= 0) return $destination;
    	$src_image = $root_destination;
    	$dst_image = $root_destination;
    	# Set defaults and meta
    	list($src_w, $src_h) = getimagesize($src_image);
    	$dst_x = 0;
    	$dst_y = 0;
    	$src_x = 0;
    	$src_y = 0;
    	$dst_w = ($dst_w <= 0) ? $src_w : $dst_w;
    	$dst_h = ($dst_h <= 0) ? $src_h : $dst_h;
    	# Load image to memory according to type
    	switch ($type) {
    		case 'bmp': $src_image = imagecreatefromwbmp($src_image); break;
    		case 'jpg': $src_image = imagecreatefromjpeg($src_image); break;
    		case 'gif': $src_image = imagecreatefromgif($src_image);  break;
    		case 'png': $src_image = imagecreatefrompng($src_image);  break;
    		default: return false;
    	}
    	# This is the resizing/resampling/transparency-preserving magic
    	$res_image = imagecreatetruecolor( $dst_w, $dst_h );
    	if ($type == "gif" or $type == "png") {
    		imagecolortransparent($res_image, imagecolorallocatealpha($res_image, 0, 0, 0, 127));
    		imagealphablending($res_image, false);
    		imagesavealpha($res_image, true);
    	}
    	# Set fill
    	if ($resample == 'fill') {
    		if($dst_w == 0)  $k = $dst_h/$src_h;
    		elseif ($dst_h == 0)  $k = $dst_w/$src_w;
    		else $k = min($dst_w/$src_w, $dst_h/$src_h);
    		$dst_x = ($dst_w - round($src_w * $k)) / 2;
    		$dst_w = $dst_w - $dst_x * 2;
    		$dst_y = ($dst_h - round($src_h * $k)) / 2;
    		$dst_h = $dst_h - $dst_y * 2;
    	}
    	imagecopyresampled($res_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
    	# Write image according to type to the output destination
    	switch($type){
    		case 'bmp': imagewbmp($res_image, $dst_image); break;
    		case 'gif': imagegif($res_image, $dst_image);  break;
    		case 'jpg': imagejpeg($res_image, $dst_image); break;
    		case 'png': imagepng($res_image, $dst_image);  break;
    	}
    	return $destination;
    }
    # ====================================
    # TEST
    # ====================================
    upload_image('image', "/img/image", '300', '200', 'fill');
    ?>
    Voyez-vous ce qui cloche ?

    Merci pour votre aide !

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Qu'entends-tu par marges transparentes ?

    Un article sur les redimensions d'images (préserve la transparence des png) ici

    Et puisque tu veux faire ces redimensionnements lors d'un upload tu peux te servir de cette classe d'upload et redimensionnement qui préserve aussi la transparence des png et te permettras par la même occasion de gérer les erreurs d'upload/redimensionnements (non gérés dans ta fonction) et tout un tas d'autre fonctionnalités en cas de besoin : upload multiple, redimensionnements multiples dans plusieurs répertoires, protection anti écrasement des fichiers serveurs avec message d'erreur ou renommage automatique des fichiers d'upload en mode incrémental ou suffixe unique, limitation du poids des fichiers, tableau de résultats, etc.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Super, merci ABCIWEB,

    Grâce à ton article, j'ai pu voir que je n'utilisais pas la bonne fonction. Ça marche nickel maintenant !

    Avec la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imagecolortransparent($res_image, imagecolorallocatealpha($res_image, 0, 0, 0, 127));
    => Nom : image1.png
Affichages : 81
Taille : 36,9 Ko

    Avec la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imagefill($res_image, 0, 0, imagecolorallocatealpha($res_image, 0, 0, 0, 127));
    => Nom : image2.png
Affichages : 74
Taille : 36,9 Ko

    Problème Résolu !

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Le problème sur la transparence des png est résolu mais ta fonction ne gère pas les erreurs. Par exemple en cas de dépassement du post_max_size du serveur tu auras une page blanche et en cas de dépassement upload_max_filesize tu n'auras aucun message en retour pour indiquer l'erreur, il peut aussi y avoir un dépassement de la mémoire serveur disponible lors du redimensionnement... Je ne vois pas non plus que tu teste le nom des fichiers uploadés pour qu'ils soient compatible avec un affichage sur le web (suppression des espaces et caractères spéciaux).

    Dès qu'on s'éloigne de quelques tests ponctuels, on s'aperçoit vite que l'upload et le redimensionnement d'images se heurte à plusieurs contraintes qu'il faut pouvoir traiter automatiquement (par exemple corriger le nom des fichiers) ou afficher un message d'erreur correspondant sinon on ne connaît jamais la cause de l'erreur et on s'acharne inutilement avec un fichier réticent. C'est pour ces raisons et pour avoir tout à la fois un code complet et rapide à mettre en place que j'ai fait cette classe d'upload et redimensionnement.
    Certes cela demande de lire le mode d'emploi pour paramétrer les fonctions dont tu as besoin mais c'est vite rentable. Par exemple si tu voulais ensuite permettre l'upload multiple, il te suffirait de l'indiquer dans le html (notation tableau pour le name du champ de type file et ajout de l'attribut mutiple = "multiple"), et c'est tout, alors qu'il faudrait largement modifier ton code php pour l'adapter Idem si tu voulais faire plusieurs redimensionnements, etc.

    Sinon si tu veux pouvoir gérer uniquement les deux premières erreurs dont j'ai parlé (dépassement post_max_size et upload_max_filesize) tu peux le faire en javascript mais c'est possible uniquement pour les navigateurs modernes html5.
    Mais au minimum dans tous les cas (car c'est une erreur fréquente), vérifies et corriges si besoin les noms des fichiers car si le nom d'une image possède par exemple un espace, tu ne pourras pas la faire afficher avec une adresse web.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Ok ABCIWEB, merci du conseil, je vais voir si je peux adapter la classe à mon utilisation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH 8] Redimensionner image
    Par arnaud_verlaine dans le forum Flash
    Réponses: 4
    Dernier message: 14/06/2006, 11h43
  2. optimisation redimensionnement image
    Par enguerran dans le forum Graphisme
    Réponses: 12
    Dernier message: 12/05/2006, 03h54
  3. Redimensionner image avant de la charger
    Par nou366 dans le forum Delphi
    Réponses: 2
    Dernier message: 11/05/2006, 13h05
  4. Redimensionner image dans MDI
    Par DEFITOP dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/05/2006, 20h02
  5. [MFC - GDI] Redimensionnement Image
    Par Ben A. dans le forum MFC
    Réponses: 3
    Dernier message: 02/02/2006, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo