Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Resize image

7 réponses
Avatar
philg42
Bonjour
J'ai un petit souci avec un script qui est censé retailler des images.
La solution est pas top puisque je les redimensionne en JS donc obligé de
télécharger une grosse image.
Le pb n'est pas la ces script me servent uniquement pour mon interface
d'administration de bdd
Voici le script :
function aff(image) {
// Declaration d'un objet Image
var img = new Image();
// Affectation du chemin de l'image a l'objet
img.src = image;
rapport=img.width/200;
if (img.width > 200) {
img.width=200;
img.height = img.height/rapport;
document.images.photo.width = img.width;
}
document.images.photo.src=image;
}

Voici le script d'appel :
<b>(71)Abri des vaches pie noire bretonne</b><br>
<form name='modif' method='post'
action='/zoonat/script/bdimage/nouvelle.php'>Orange, telle est la couleur
dédiée à nos pie noire bretonne<br>
<img src='' name='photo'><br><hr>
<script type='text/javascript'>
aff('http://localhost/zoonat/animaux_de_la_ferme/images/pie_noire/P7050679.jpg');
</script>
</form><b>(72)Abri de nos mouflons nain.</b><br>
<form name='modif' method='post'
action='/zoonat/script/bdimage/nouvelle.php'>Nos mouflons Djallonké ont
hérités de l'abri blanc, mélange des couleurs primaires de l'arc en
ciel.<br>
<img src='' name='photo'><br><hr>
<script type='text/javascript'>
aff('http://localhost/zoonat/animaux_de_la_ferme/images/mouflon/P7050693.jpg');
</script>
.
.
...etc (c'est généré avec du php)
Le problème est que de temps en temps, les images ne sont pas retaillées et
d'affichent en grand (640x480)
Il semble que seules les images en cache de IE s'affichent bien.
Si vous aviez une petite idée pour que ça marche à tous les coups....
Merci d'avance

7 réponses

Avatar
ASM
Il semble que seules les images en cache de IE s'affichent bien.
Si vous aviez une petite idée pour que ça marche à tous les coups....


il faut s'assurer que l'image est chargée
çà se fait avec image.onload

et pendant quon y est, on essaie que çà fonctionne
sur tous navigateurs

function aff(image) {
// Declaration du lieu d'affichage
var cible = document.images['photo'];
// Declaration d'un objet Image
var img = new Image();
// apres mise en cache, exec de ce que tu veux
img.onload = function() {
rapport = img.width/200;
if(img.width > 200) {
cible.style.width = 200+'px';
var haut = parseInt(img.height/rapport);
cible.style.height = haut+'px';
}
else
cible.style.width = img.width+'px';
cible.src = img.src; // on affiche le truc mis en cache
};
// Affectation du chemin de l'image a l'objet
img.src = image;
}



--
Stephane Moriaux et son [moins] vieux Mac

Avatar
ASM

...etc (c'est généré avec du php)
Le problème est que de temps en temps, les images ne sont pas retaillées et
d'affichent en grand (640x480)


alors ... pourquoi n'assures-tu pas le retaillage
directement en php ?


--
Stephane Moriaux et son [moins] vieux Mac

Avatar
philg42
"ASM" a écrit dans le message
de news: 43463d0b$0$7870$

...etc (c'est généré avec du php)
Le problème est que de temps en temps, les images ne sont pas retaillées
et d'affichent en grand (640x480)


alors ... pourquoi n'assures-tu pas le retaillage
directement en php ?

C'est vrai que la solution serait beaucoup plus élégante et surtout moins

gourmande en terme de transfert.
Mais comme je balance déjà du html avant l'affichage des images, je ne peux
pas passer par un header ...jpg
En plus, dès que j'essaie le traitement d'image en php, j'ai une quantité
d'erreurs encore plus importante qu'en JS
Merci de ta réponse. Je vais essayer ta solution.

--
Philippe, webmestre amateur et bénévole
http://www.montagnesdumatin.com
http://www.zoonat.com
http://www.location-studio-paris-13.com
http://panissieres.free.fr


Avatar
philg42
"ASM" a écrit dans le message
de news: 43463c76$0$7870$
Il semble que seules les images en cache de IE s'affichent bien.
Si vous aviez une petite idée pour que ça marche à tous les coups....


il faut s'assurer que l'image est chargée
çà se fait avec image.onload

et pendant quon y est, on essaie que çà fonctionne
sur tous navigateurs

function aff(image) {
// Declaration du lieu d'affichage
var cible = document.images['photo'];
// Declaration d'un objet Image
var img = new Image();
// apres mise en cache, exec de ce que tu veux
img.onload = function() {
rapport = img.width/200;
if(img.width > 200) {
cible.style.width = 200+'px';
var haut = parseInt(img.height/rapport);
cible.style.height = haut+'px';
}
else
cible.style.width = img.width+'px';
cible.src = img.src; // on affiche le truc mis en cache
};
// Affectation du chemin de l'image a l'objet
img.src = image;
}
Stephane Moriaux et son [moins] vieux Mac


Merci du coup de main.
Ca marche impec


Avatar
Moustique
philg42 a exprimé avec précision :
"ASM" a écrit dans le message
de news: 43463d0b$0$7870$

...etc (c'est généré avec du php)
Le problème est que de temps en temps, les images ne sont pas retaillées
et d'affichent en grand (640x480)


alors ... pourquoi n'assures-tu pas le retaillage
directement en php ?

C'est vrai que la solution serait beaucoup plus élégante et surtout moins

gourmande en terme de transfert.
Mais comme je balance déjà du html avant l'affichage des images, je ne peux
pas passer par un header ...jpg
En plus, dès que j'essaie le traitement d'image en php, j'ai une quantité
d'erreurs encore plus importante qu'en JS
Merci de ta réponse. Je vais essayer ta solution.


Salut Phil,

Je ne sais pas comment as-tu fait pour retailler ton image en php, mais
c'est vraiment pas difficile. Je te donne cette fonction:

<?PHP
// fonction qui reduit une image a partir d un fichier et l enregistre
dans un ti_fichier
// Nom du fichier, tx de compression, Taille hauteur max, Taille
largeur Max, rep source, rep de destination, prefixe a mettre
function
reduit_fichier($fichier_image,$scale,$max_v,$max_h,$source,$destination,$prefixe)
{
// MAX_V = HAUTEUR -- MAX_H = LARGEUR
// le nom de l'image "scalée" commencera par ti_ et le nom du
fichier original
$ti_fichier_image=$prefixe.$fichier_image;
global $nomfichier;
$im = ImageCreateFromjpeg($source.$fichier_image);
$v=ImageSY($im); // $v prend la hauteur
$h=ImageSX($im); // $h prend la largeur
//Floor Arrondi à l'entier inférieur

//ON GERE LA HAUTEUR
if ($v > $max_v) // Si la hauteur Img, est plus grand que le max,
on reduit
{
$taux_hauteur=$v/$max_v; // On recupere le taux necessaire
pour retrecir
$ti_v=(int)floor($max_v); // ti_v = taille final de la hauteur
$ti_h=(int)floor($h/$taux_hauteur); // ti_h = taille final de
la largeur
}
else $ti_v=$v; // Sinon on fixe la hauteur

// Si il n'a pas deja subbit une modification de la taille
if ($ti_h!="") $h_comp = $ti_h; else $h_comp = $h;
if ($ti_v!="") $v_comp = $ti_v; else $v_comp = $v;

//ON GERE LA LARGEUR
if ($h_comp > $max_h)
{
$taux_largeur=$h_comp/$max_h;
$ti_h=(int)floor($max_h);
$ti_v=(int)floor($v_comp/$taux_largeur);
}
else $ti_h=$h_comp;
//ImageCreateTrueColor version GD 2
//imagecopyresampled version GD 1.8
//imagecopyresized
//ImageCreate GD 1.8
//
$ti_im = ImageCreateTrueColor($ti_h,$ti_v);
imagecopyresampled($ti_im,$im,0,0,0,0,$ti_h,$ti_v,$h,$v);
imagejpeg($ti_im,"$destination"."$ti_fichier_image",$scale);
$nomfichier = $destination.$ti_fichier_image;
}

// Exemple pour creer une miniature :
//reduit_fichier($fic,75,100,200,$path_source,$path_minia,"st_");
// Exemple pour creer une image reduite depassant pas les 500 :
//($fic,75,500,500,$path_source,$path_dest_photo,"");

?>



Avatar
Moustique
philg42 a exprimé avec précision :
"ASM" a écrit dans le message de
news: 43463d0b$0$7870$

...etc (c'est généré avec du php)
Le problème est que de temps en temps, les images ne sont pas retaillées
et d'affichent en grand (640x480)


alors ... pourquoi n'assures-tu pas le retaillage
directement en php ?

C'est vrai que la solution serait beaucoup plus élégante et surtout moins

gourmande en terme de transfert.
Mais comme je balance déjà du html avant l'affichage des images, je ne peux
pas passer par un header ...jpg
En plus, dès que j'essaie le traitement d'image en php, j'ai une quantité
d'erreurs encore plus importante qu'en JS
Merci de ta réponse. Je vais essayer ta solution.


Salut Phil,

Je ne sais pas comment as-tu fait pour retailler ton image en php, mais
c'est vraiment pas difficile. Je te donne cette fonction:

<?PHP
// fonction qui reduit une image a partir d un fichier et l enregistre
dans un ti_fichier
// Nom du fichier, tx de compression, Taille hauteur max, Taille
largeur Max, rep source, rep de destination, prefixe a mettre
function
reduit_fichier($fichier_image,$scale,$max_v,$max_h,$source,$destination,$prefixe)
{
// MAX_V = HAUTEUR -- MAX_H = LARGEUR
// le nom de l'image "scalée" commencera par ti_ et le nom du
fichier original
$ti_fichier_image=$prefixe.$fichier_image;
global $nomfichier;
$im = ImageCreateFromjpeg($source.$fichier_image);
$v=ImageSY($im); // $v prend la hauteur
$h=ImageSX($im); // $h prend la largeur
//Floor Arrondi à l'entier inférieur

//ON GERE LA HAUTEUR
if ($v > $max_v) // Si la hauteur Img, est plus grand que le max,
on reduit
{
$taux_hauteur=$v/$max_v; // On recupere le taux necessaire
pour retrecir
$ti_v=(int)floor($max_v); // ti_v = taille final de la hauteur
$ti_h=(int)floor($h/$taux_hauteur); // ti_h = taille final de
la largeur
}
else $ti_v=$v; // Sinon on fixe la hauteur

// Si il n'a pas deja subbit une modification de la taille
if ($ti_h!="") $h_comp = $ti_h; else $h_comp = $h;
if ($ti_v!="") $v_comp = $ti_v; else $v_comp = $v;

//ON GERE LA LARGEUR
if ($h_comp > $max_h)
{
$taux_largeur=$h_comp/$max_h;
$ti_h=(int)floor($max_h);
$ti_v=(int)floor($v_comp/$taux_largeur);
}
else $ti_h=$h_comp;
//ImageCreateTrueColor version GD 2
//imagecopyresampled version GD 1.8
//imagecopyresized
//ImageCreate GD 1.8
//
$ti_im = ImageCreateTrueColor($ti_h,$ti_v);
imagecopyresampled($ti_im,$im,0,0,0,0,$ti_h,$ti_v,$h,$v);
imagejpeg($ti_im,"$destination"."$ti_fichier_image",$scale);
$nomfichier = $destination.$ti_fichier_image;
}

// Exemple pour creer une miniature :
//reduit_fichier($fic,75,100,200,$path_source,$path_minia,"st_");
// Exemple pour creer une image reduite depassant pas les 500 :
//($fic,75,500,500,$path_source,$path_dest_photo,"");

?>



Avatar
philg42
"Moustique" a écrit dans le message de news:

philg42 a exprimé avec précision :
"ASM" a écrit dans le
message de news: 43463d0b$0$7870$

...etc (c'est généré avec du php)
Le problème est que de temps en temps, les images ne sont pas
retaillées et d'affichent en grand (640x480)


alors ... pourquoi n'assures-tu pas le retaillage
directement en php ?

C'est vrai que la solution serait beaucoup plus élégante et surtout moins

gourmande en terme de transfert.
Mais comme je balance déjà du html avant l'affichage des images, je ne
peux pas passer par un header ...jpg
En plus, dès que j'essaie le traitement d'image en php, j'ai une quantité
d'erreurs encore plus importante qu'en JS
Merci de ta réponse. Je vais essayer ta solution.


Salut Phil,

Je ne sais pas comment as-tu fait pour retailler ton image en php, mais
c'est vraiment pas difficile. Je te donne cette fonction:

<?PHP
// fonction qui reduit une image a partir d un fichier et l enregistre
dans un ti_fichier
// Nom du fichier, tx de compression, Taille hauteur max, Taille largeur
Max, rep source, rep de destination, prefixe a mettre
function
reduit_fichier($fichier_image,$scale,$max_v,$max_h,$source,$destination,$prefixe)
{
// MAX_V = HAUTEUR -- MAX_H = LARGEUR
// le nom de l'image "scalée" commencera par ti_ et le nom du fichier
original
$ti_fichier_image=$prefixe.$fichier_image;
global $nomfichier;
$im = ImageCreateFromjpeg($source.$fichier_image);
$v=ImageSY($im); // $v prend la hauteur
$h=ImageSX($im); // $h prend la largeur
//Floor Arrondi à l'entier inférieur

//ON GERE LA HAUTEUR
if ($v > $max_v) // Si la hauteur Img, est plus grand que le max, on
reduit
{
$taux_hauteur=$v/$max_v; // On recupere le taux necessaire pour
retrecir
$ti_v=(int)floor($max_v); // ti_v = taille final de la hauteur
$ti_h=(int)floor($h/$taux_hauteur); // ti_h = taille final de la
largeur
}
else $ti_v=$v; // Sinon on fixe la hauteur

// Si il n'a pas deja subbit une modification de la taille
if ($ti_h!="") $h_comp = $ti_h; else $h_comp = $h;
if ($ti_v!="") $v_comp = $ti_v; else $v_comp = $v;

//ON GERE LA LARGEUR
if ($h_comp > $max_h)
{
$taux_largeur=$h_comp/$max_h;
$ti_h=(int)floor($max_h);
$ti_v=(int)floor($v_comp/$taux_largeur);
}
else $ti_h=$h_comp;
//ImageCreateTrueColor version GD 2
//imagecopyresampled version GD 1.8
//imagecopyresized
//ImageCreate GD 1.8
//
$ti_im = ImageCreateTrueColor($ti_h,$ti_v);
imagecopyresampled($ti_im,$im,0,0,0,0,$ti_h,$ti_v,$h,$v);
imagejpeg($ti_im,"$destination"."$ti_fichier_image",$scale);
$nomfichier = $destination.$ti_fichier_image;
}

// Exemple pour creer une miniature :
//reduit_fichier($fic,75,100,200,$path_source,$path_minia,"st_");
// Exemple pour creer une image reduite depassant pas les 500 :
//($fic,75,500,500,$path_source,$path_dest_photo,"");

Merci de ta solution.

J'utilise à peu près le meme script (en plus simple) pour générer mes
miniatures d'affichage du site genre la page :
http://www.zoonat.com/elevage_des_bruyeres/naissances/chiots_cavalier_king_charles.php
Mais ce que je voulais dans le cas du post est une réduction à la volée sans
stockage d'image sur le serveur. J'ai déja une 640x480 et une 256x192 (en
moyenne) donc je ne souhaites pas en rajouter une autre.
Je garde ton script au chaud pur l'étudier.
Merci