Forum ZitePLUS

La communauté des utilisateurs du CMS ZitePLUS

Vous n'êtes pas identifié(e).

#1 11/11/2012 19:57:59

Christian
Moderateurs
Inscription : 19/06/2010
Messages : 139

Redimensionnement automatique d'images

Bonjour

J’ai de nouveau un problème avec mon copain (dont j'ai parlé dans un autre post)
Il continu a uploader des images qui sont 3 fois plus grosse que l'utilisation final.

Je me suis dit que j'allais lui installer "une parade" smile

Question :
L'un d'entre vous aurait-il sous la main (ou aurait-il adapté pour Zite+) un script qui redimensionne "automatiquement" les images, dans le style de ce que fait Wordpress par exemple !
Un script qui permet d'uploader une seule dimension pourrait même me convenir, je ferais la page avec des cases à cocher avec les dimensions utiles.

J'avais trouvé ca :
http://www.commentcamarche.net/forum/af … -un-upload
Mais je n'arrive pas à l'adapter

Christian

Hors ligne

#2 12/11/2012 00:32:10

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : Redimensionnement automatique d'images

Bonsoir,

Une autre solution: tu utilises une version dérivée de mon script pour générer les miniatures.

C'est dans le fichier tdocsadmin.php (du répertoire ziteplus)

La fonction c'est makethumb().

Il faut juste:

- dupliquer la fonction (en attendant une prochaine version paramétrable)

- modifier la valeur 100 (pixels;)) qui est en dure dans le source

- changer le nom du fichier de destination: $imgthumb et mettre l'image d'origine ($imgname)

Cela devrait marcher.

a+
Jean-Paul

ps: en bonus, le script conserve la transparence des images

Hors ligne

#3 12/11/2012 02:06:01

Christian
Moderateurs
Inscription : 19/06/2010
Messages : 139

Re : Redimensionnement automatique d'images

Bonsoir

Merci jpg pour cette réponse rapide wink

1) cela m'a l'air d'être une trés bonne idée !

2) du coup j'ai regardé le dossier thumbs que je n'avais pas nettoyé la première fois !! GGGGrrrr
Il y a une commande pour relancer la création des thumbs, si je les vire tous ?
J'ai vu un dojob dans selectdoc.php, mais je ne vois pas comment le lancer !
   
3) J'essaie ton idée dans la semaine.

Christian

Hors ligne

#4 13/11/2012 00:50:40

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : Redimensionnement automatique d'images

Christian a écrit :

2) du coup j'ai regardé le dossier thumbs que je n'avais pas nettoyé la première fois !! GGGGrrrr
Il y a une commande pour relancer la création des thumbs, si je les vire tous ?

Oui

Christian a écrit :

J'ai vu un dojob dans selectdoc.ph

Il existe la fonction:     makethumbs() {//générer les miniatures de tous les fichiers images qui ont changés
mais le plus simple pour l'executer depuis ton site, il faut être logué en admin et lancer: http://tonsite/?z=selectdoc|go
Enfin je crois wink, c'est de mémoire
Tu peux avoir un timeout du script si tu as beaucoup d'image. soit tu règles le timeout, soit tu relance plusieus fois la génération jusqu'a traiter tous les fichiers wink

Tiens, ça me fait penser que si tu lance via tinymce le tinybrowwser à la sauce ziteplus, ça va aussi recréer les miniatures qui manquent

a+
Jean-Paul

Hors ligne

#5 30/11/2012 19:32:53

Christian
Moderateurs
Inscription : 19/06/2010
Messages : 139

Re : Redimensionnement automatique d'images

Bonjour

Merci jpg, la commande ?z=selectdoc|go fonctionne très bien !  wink

et makethumbs() que j'ai modifié et que je viens de tester en interne me donne satisfaction
Je vais la mettre en place et voir quel problème je rencontre avec en utilisation normal.

Si cela intéresse je la mettrais à dispo

Christian

Hors ligne

#6 11/01/2013 00:25:43

jpaul
Membre
Lieu : Belgique
Inscription : 07/06/2008
Messages : 17
Site Web

Re : Redimensionnement automatique d'images

Bonsoir,
J'ai essayé d'appliquer cette modification du code.
Ca fonctionne si je ne duplique pas la fonction. Mais alors je n'ai plus de miniature...
Sinon, la page reste blanche car il a un conflit entre les fonctions de même nom.
J'ai essayé des noms différents, mais je ne sais pas comment faire.
Merci pour votre aide.

Hors ligne

#7 12/01/2013 00:38:20

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : Redimensionnement automatique d'images

Bonsoir,

jpaul a écrit :

J'ai essayé d'appliquer cette modification du code

Laquelle exactement ?

a+
Jean-Paul

ps: tu est dans quelle version de Ziteplus ?

Hors ligne

#8 12/01/2013 01:46:47

jpaul
Membre
Lieu : Belgique
Inscription : 07/06/2008
Messages : 17
Site Web

Re : Redimensionnement automatique d'images

Bonsoir,
Celle décrite plus haut:

C'est dans le fichier tdocsadmin.php (du répertoire ziteplus)

La fonction c'est makethumb().

Il faut juste:

- dupliquer la fonction (en attendant une prochaine version paramétrable)

- modifier la valeur 100 (pixels;)) qui est en dure dans le source

- changer le nom du fichier de destination: $imgthumb et mettre l'image d'origine ($imgname)

Voici: ce que j'ai modifié:

[== Indéfini ==]
				if (imagesx($img)>=imagesy($img)) {
					$largeur = 600; $hauteur = $largeur*imagesy($img)/imagesx($img); // paramétrer le 100 !!!
				} else {
					$hauteur = 600; $largeur = $hauteur*imagesx($img)/imagesy($img); // paramétrer le 100 !!!
				}
				$img_out = imagecreatetruecolor($largeur, $hauteur);
				@imagealphablending($img_out, false);
				imagecopyresampled($img_out, $img, 0, 0, 0, 0, imagesx($img_out), imagesy($img_out), imagesx($img), imagesy($img));
				@imagesavealpha($img_out, true);
	      imagepng($img_out,$imgname);
	      imagedestroy($img);
	      imagedestroy($img_out);

J'utilise Ziteplus  9.2
Un grand merci
JPAul

Dernière modification par jpaul (12/01/2013 01:48:33)

Hors ligne

#9 12/01/2013 13:46:46

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : Redimensionnement automatique d'images

Bonjour,

alors pour compléter le texte: dupliquer la fonction et la renommer wink

cela permet de garder les miniatures: c'est la version ziteplus qui sera appeler par la gestion des documents
cela permet aussi de faire ce que tu veux de ta nouvelle fonction en appelant directement ta fonction renommée

a+
Jean-paul

Hors ligne

#10 13/01/2013 00:14:57

jpaul
Membre
Lieu : Belgique
Inscription : 07/06/2008
Messages : 17
Site Web

Re : Redimensionnement automatique d'images

Bonsoir,
C'est bien ce que j'avais fait car deux fonctions ne peuvent pas porter le même nom sinon c'est, je présume, la dernière qui est prise en compte...
Je l'avais renommé : makeimages() Mais où dois-je la remettre ?
Je l'ai mise dans selectdoc qui se trouve dans le répertoire module.

[== PHP ==]
  	  @set_time_limit(0);
			$zdocs = new Tdocsadmin(self::$cms->cpath.'/docs.dta');
			$zdocs->makethumbs();
			$zdocs->makeimages();
			unset($zdocs);
			return self::$cms->msgShow('done_ok');
			exit;

Mais ça ne fonctionne pas non plus.
Bien à toi
J-Paul

Dernière modification par jpaul (13/01/2013 00:27:33)

Hors ligne

#11 13/01/2013 19:03:47

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : Redimensionnement automatique d'images

Bonjour,
Dans le script que tu donnes, qu'est ce qui ne fonctionne pas ?
Peux tu aussi préciser ce que tu veux faire, cela permettra de voir si la solution proposée à Christian te convient wink
a+
Jean-Paul

Hors ligne

#12 13/01/2013 19:36:58

jpaul
Membre
Lieu : Belgique
Inscription : 07/06/2008
Messages : 17
Site Web

Re : Redimensionnement automatique d'images

Bonjour,
Au fait, j'aimerai que lorsque l'on télécharge des photos, elles se redimensionnent automatiquement en max 600 X max 400 de haut.
Ce qui ne fonctionne pas: Il n'y a pas de redimensionnement...
Autre chose qui n'a rien à voir, je cherche également augmenter le temps de la session lors que l'on est loguer pour une mise à jour pour éviter des pages où il faut tout recommencer car on a pas enregistré régulièrement.
Bien à toi
JPaul

Dernière modification par jpaul (14/01/2013 00:02:35)

Hors ligne

#13 14/01/2013 11:57:34

jpaul
Membre
Lieu : Belgique
Inscription : 07/06/2008
Messages : 17
Site Web

Re : Redimensionnement automatique d'images

Bonjour,
Mon problème vient surtout que je ne sais pas où mettre la fonction
Je l'ai mise ici, mais ça ne fonctionne pas, faut-il a mettre autre part?
Dans selectdoc.php :

[== php ==]
			$zdocs = new Tdocsadmin(self::$cms->cpath.'/docs.dta');
			$zdocs->makethumb();
			$zdocs->makeimages();
			unset($zdocs);
			return self::$cms->msgShow('done_ok');
			exit;
		}

et j'ai rajouté ceci dans tdocsadmin.php :

[== php ==]
	function makeimages() {//générer les miniatures de tous les fichiers images qui ont changés
		foreach (self::$docs as $ident => $doc) {//pour chaque document
	  	$this->makeimage($ident);
		}
 	}

et

[== PHP ==]
	function makeimage($ident,$force=false) {  //Pour forcer le redimentionnement des images en 600 X 400 max.
		if(isset(self::$cms)) {
			$dirdoc = self::$cms->dpath.'/';
		} else {
		  $dirdoc = dirname(__FILE__).'/../zdata/zdocs/';//substr($_SERVER['SCRIPT_FILENAME'],0,stripos($_SERVER['SCRIPT_FILENAME'],'tinymce')).'zdata/zdocs/';;
		}
		$dirthumb = $dirdoc.'thumbs/';
		if ($this->isDocAuth($ident)&&($this->getValues($ident,cDocType)=='img')) {//de type image accessible
		  $docname = $this->getValues($ident,cDocFilename);
		  if (!file_exists($dirthumb.$docname) || (filemtime($dirthumb.$docname)<filemtime($dirdoc.$docname)) || $force ) {//Pas de miniature ou trop ancienne ou génération forcée
				$imgname = $dirdoc.$docname;
	  		$imgthumb = $dirthumb.$docname;
					//      list($width, $height, $type, $attr) = getimagesize("$pic");
			  switch($this->getValues($ident,cDocExt)) {
    			case 'jpg': case 'jpe': case 'jpeg':
						$img = imagecreatefromjpeg($imgname);
						break;
					case 'png':
						$img = imagecreatefrompng($imgname);
						@imagealphablending($img, false);
						break;
					case 'gif':
						$img = imagecreatefromgif($imgname);
			  		break;
		      default :
  		    	break;
				}
				if (imagesx($img)>=imagesy($img)) {
					$largeur = 600; $hauteur = $largeur*imagesy($img)/imagesx($img); // paramétrer le 100 !!!
				} else {
					$hauteur = 600; $largeur = $hauteur*imagesx($img)/imagesy($img); // paramétrer le 100 !!!
				}
				$img_out = imagecreatetruecolor($largeur, $hauteur);
				@imagealphablending($img_out, false);
				imagecopyresampled($img_out, $img, 0, 0, 0, 0, imagesx($img_out), imagesy($img_out), imagesx($img), imagesy($img));
				@imagesavealpha($img_out, true);
	      imagepng($img_out,$imgname);
	      imagedestroy($img);
	      imagedestroy($img_out);
	      return true;
			} else return false;
		} else return false;
	}

Pour ce qui est de garder ouvert la session j'ai trouvé en mettant session_unset(); en remarque:

[== Indéfini ==]
		if($cs || !array_key_exists('zite_admin',$_SESSION) || $_SESSION['zite_id'] != $this->config['site_id']) {
			//session_unset(); 
			$_SESSION['zite_admin'] = 0;
			$_SESSION['zite_id'] = $this->config['site_id'];
			$_SESSION['showadminbar'] = false;
			$_SESSION['zite_usergroup']=array();
		}

Encore merci
J-Paul

Dernière modification par jpaul (14/01/2013 14:38:35)

Hors ligne

#14 14/01/2013 15:46:03

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : Redimensionnement automatique d'images

Désolé,mais pas vraiment le temps actuellement  roll
je reviens sur ton problème (et sa solution) ce soir en principe
a+
Jean-Paul

Hors ligne

#15 14/01/2013 17:53:29

Super_chemist
Membre
Inscription : 27/05/2011
Messages : 417

Re : Redimensionnement automatique d'images

Salut

Je crois que ton problème, c'est que makeimage() travaille dans le dossier /thumbs, alors que tu veux modifier les images originales...
Faut toujours faire gaffe avec le copier-coller ! Il y a toujours une ligne qu'on oublie!


A+

Hors ligne

#16 14/01/2013 21:45:50

jpaul
Membre
Lieu : Belgique
Inscription : 07/06/2008
Messages : 17
Site Web

Re : Redimensionnement automatique d'images

Non, je ne pense pas... Car ça fonctionne si je change uniquement les dimensions et la ligne :

	      imagepng($img_out,$imgname);

C'est juste que je ne sais pas où remettre la fonction pour pouvoir garder les vignettes.
Merci
JPaul

Hors ligne

#17 14/01/2013 23:52:47

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : Redimensionnement automatique d'images

Bonsoir,
alors tu remplaces le fichier tdocsadmin.php par celui-ci

<?php
/*
Classe: Gestion des documents
Copyright Jean-Paul GIAUSSERAND 2009-2013
Site: http://www.giausserand.fr/index.php?perma=ziteplus
Licence : CeCILL-B, http://www.cecill.info
	V2.0bis - hors version standard
	v2.0: Implémentation des interfaces
	v1.2: utilisation isDocAuthWrite dans les fonctions internes de Tdocsadmin
	v1.1: Ajout gestion des vignettes
	v1.0: Création de la classe
*/
require_once dirname(__FILE__).'/tdocs.php';
	//
class Tdocsadmin extends Tdocs {
	protected static $cms;
	public static function set_cms(zite $zp) {	  self::$cms = $zp;	}
	//
	protected function _isDocAuth($docname) {
		return ($this->_isDoc($docname)&&(($_SESSION['zite_admin']==2)||( (!empty(self::$docs[$docname][cDocWrite])) &&  array_intersect(self::$docs[$docname][cDocWrite],$_SESSION['zite_usergroup'])!= array())));
	}
	public function save(){//doit-être protected ?
		$i=@file_put_contents(self::$filename, serialize(self::$docs), LOCK_EX );
		$this->_init();
		return $i;
	}
	/*Interface ArrayAccess*/
	public function offsetSet($key, $doc) {
		if (!$this->_isDoc($key)||$this->_isDocAuth($key)) {
		  $this->_compactDoc($key,$doc);
			self::$docs[$key] = $doc;
			if (!in_array($key,$this->docsR)) $this->docsR[]=$key;
		}
	}
	public function offsetUnset($key) {
		if ($this->_isDocAuth($key))	{
			unset(self::$docs[$key]);
//			unset($this->docsR[$key]);//à vérifier  //			$this->_init();
		}
  }
  /**/
  protected function _compactDoc($key,&$doc){
    $change=false;
		$ext = pathinfo($key); $ext = strtolower($ext['extension']);
		$desc = basename($key,'.'.$ext);
		$filename = strtolower($key);
		if (isset($doc[cDocFilename])&&(strtolower($doc[cDocFilename])==$filename)) {unset($doc[cDocFilename]);$change=true;}
		if (isset($doc[cDocDesc])&& ($doc[cDocDesc]==$desc)) {unset($doc[cDocDesc]);$change=true;}
		if (isset($doc[cDocWrite]) && in_array('admin',$doc[cDocWrite])) $doc[cDocWrite]=array_diff($doc[cDocWrite],array('admin'));
		if (isset($doc[cDocWrite])&&($doc[cDocWrite]==array())) {unset($doc[cDocWrite]);$change=true;}
		if (isset($doc[cDocRead])&&($doc[cDocRead]==array())) {unset($doc[cDocRead]);$change=true;}
		if (isset($doc[cDocRub])&&($doc[cDocRub]==array())) {unset($doc[cDocRub]);$change=true;}
		if (isset($doc[cDocAuth])&&($doc[cDocAuth]=='admin')) {unset($doc[cDocAuth]);$change=true;}
		if (isset($doc[cDocExt])&&($doc[cDocExt]==$ext)) {unset($doc[cDocExt]);$change=true;}
		return $change;
	}
  /**/
	public function isDocAuthWrite($docname) {
		if ($this->_isDoc($docname) && (($_SESSION['zite_admin']==2)||(array_intersect((array)$this[$docname][cDocWrite],$_SESSION['zite_usergroup'])!= array()))) {
			return true;
		} else return false;
	}
	//
	function removeDoc($docname) {
	  $this->refresh();
	  if ($this->isDocAuthWrite($docname)) {//v091
			unset(self::$docs[$docname]);
			$this->save();
		}
	}
	function updateDoc($docname, $filename,$ext,$rub,$desc,$auth,$groupW,$groupR,$type,$date) {
	  $this->refresh();
	  $this[$docname] = array($filename,$ext,$rub,$desc,$auth,$groupW,$groupR,$type,$date);
		$this->save();
		$this->makethumb($docname);
	}
	function verifdoc(&$doc,&$ident,&$ext,&$rub,&$desc,&$auth,&$groupW,&$groupR,&$type,&$date) {
		$ident = trim(stripslashes($ident));
		$doc = trim(stripslashes($doc));
		$ext = pathinfo($doc); $ext = strtolower($ext['extension']);
	  switch($ext) {
	    case 'jpg': case 'jpe': case 'jpeg': case 'png': case 'gif':
	      $type = 'img';
	      break;
			case 'pdf': case 'txt':
			  $type = $ext;
			  break;
			case 'zip': case 'Zz' : case 'tar' : case 'rar' :
			  $type = 'zip';
			  break;
			case 'swf': case 'mov' : case 'flv' : case 'wmv': case 'mkv':
			case 'dcr': case 'qt': case 'mpg': case 'mp4': case 'mpeg': case 'avi': case 'wm':
			case 'asf': case 'asx': case 'wmx': case 'wvx': case 'rm': case 'ra': case 'ram':
			  $type = 'film';
			  break;
			case 'mp3':
			  $type='son';
			  break;
			default :
			  $type = '';
		}
		if (empty($ident)) {
		  $ident=$doc;
		}
		if (empty($desc)) {
		  $desc = basename($ident,'.'.$ext);
		}
		if (in_array('admin',$groupW)) {
		  $groupW=array_diff($groupW,array('admin'));
		}
		if (empty($auth))	$auth = $_SESSION['zite_user'];
		if (empty($date)) $date = @date("d/m/Y");
	}
	function makethumb($ident,$force=false) {
		if(isset(self::$cms)) {
			$dirdoc = self::$cms->dpath.'/';
		} else {
		  $dirdoc = dirname(__FILE__).'/../zdata/zdocs/';//substr($_SERVER['SCRIPT_FILENAME'],0,stripos($_SERVER['SCRIPT_FILENAME'],'tinymce')).'zdata/zdocs/';;
		}
		$dirthumb = $dirdoc.'thumbs/';
		if ($this->isDocAuth($ident)&&($this->getValues($ident,cDocType)=='img')) {//de type image accessible
		  $docname = $this->getValues($ident,cDocFilename);
		  if (!file_exists($dirthumb.$docname) || (filemtime($dirthumb.$docname)<filemtime($dirdoc.$docname)) || $force ) {//Pas de miniature ou trop ancienne ou génération forcée
				$imgname = $dirdoc.$docname;
	  		$imgthumb = $dirthumb.$docname;
					//      list($width, $height, $type, $attr) = getimagesize("$pic");
			  switch($this->getValues($ident,cDocExt)) {
    			case 'jpg': case 'jpe': case 'jpeg':
						$img = imagecreatefromjpeg($imgname);
						break;
					case 'png':
						$img = imagecreatefrompng($imgname);
						@imagealphablending($img, false);
						break;
					case 'gif':
						$img = imagecreatefromgif($imgname);
			  		break;
		      default :
  		    	break;
				}
					// retailler l'image de base si elle dépasse la taille maximun
				if (imagesx($img)>=imagesy($img)) {
					$largeur = 600; $hauteur = $largeur*imagesy($img)/imagesx($img); 
				} else {
					$hauteur = 400; $largeur = $hauteur*imagesx($img)/imagesy($img);
				}
				$img_out = imagecreatetruecolor($largeur, $hauteur);
				@imagealphablending($img_out, false);
				imagecopyresampled($img_out, $img, 0, 0, 0, 0, imagesx($img_out), imagesy($img_out), imagesx($img), imagesy($img));
				@imagesavealpha($img_out, true);
	      imagepng($img_out,$imgname);
	      imagedestroy($img_out);
					// générer les vignettes
				if (imagesx($img)>=imagesy($img)) {
					$largeur = 100; $hauteur = $largeur*imagesy($img)/imagesx($img); // paramétrer le 100 !!!
				} else {
					$hauteur = 100; $largeur = $hauteur*imagesx($img)/imagesy($img); // paramétrer le 100 !!!
				}
				$img_out = imagecreatetruecolor($largeur, $hauteur);
				@imagealphablending($img_out, false);
				imagecopyresampled($img_out, $img, 0, 0, 0, 0, imagesx($img_out), imagesy($img_out), imagesx($img), imagesy($img));
				@imagesavealpha($img_out, true);
	      imagepng($img_out,$imgthumb);
	      imagedestroy($img);
	      imagedestroy($img_out);
	      return true;
			} else return false;
		} else return false;
	}
	function makethumbs() {//générer les miniatures de tous les fichiers images qui ont changés
		foreach (self::$docs as $ident => $doc) {//pour chaque document
	  	$this->makethumb($ident);
		}
 	}
  function compact($change=false){//en cours
		foreach(self::$docs as $key => &$doc) {
			$change|=$this->_compactDoc($key,$doc);
		}
		if ($change) $this->save();
	}
}
?>

Sous réserve que fluxbb garde les ' "" et autres / et \, ce code est fonctionnel.

A chaque fois que tu vas télécharger une image, individuellement ou par la gestion par lot,
si cette image dépasse 600x400 elle sera retaillée.
La génération des vignettes est préservée.

ps: Ce code est très proche de la future version alpha mis à part le paramétrage absent et une petite optimisation

a+
Jean-Paul

Hors ligne

#18 15/01/2013 00:03:20

jpaul
Membre
Lieu : Belgique
Inscription : 07/06/2008
Messages : 17
Site Web

Re : Redimensionnement automatique d'images

Que dire...
Merci beaucoup, cela fonctionne très bien...
Bravo pour tout ce que tu fait...
Quand j'aurai un peu de temps j'essayerai de modifier le code pour permettre de choisir entre différents formats (600x400, 1000x600, taille original)
J-Paul

Dernière modification par jpaul (15/01/2013 00:06:41)

Hors ligne

#19 16/01/2013 00:34:45

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : Redimensionnement automatique d'images

Je viens de voir un petit bug dans le source: l'image redimensionné est systématiquement de type png, mais le type déclaré reste le type d'origine (gig, jpg ou png)
Ce sera corrigé dans la prochaine alpha.
a+
Jean-Paul

Hors ligne

Pied de page des forums