|
|
|
|
Bonjour,
J'ai actuellement une page qui affiche une image après avoir été réduite.
J'avais commencé grâce à une fonction JavaScript mais cela ne marchait pas.
La photo ne s'affichait pas tout le temps et ce de façon totalement aléatoire à chaque chargement de la page (voir mon ancien post : http://www.commentcamarche.net/forum/affich 4735139 javascript redimensionnement d image).
J'ai donc abandonné car impossible pour moi de trouver le problème.
J'utilise maintenant une simple classe CSS mais j'ai le même problème (ou presque). L'image ne s'affiche pas tout le temps.
Mais là, parfois, à ma grande surprise, la photo s'affiche avec une taille presque 10 fois inférieure à ce qui devrait s'afficher.
En résumé, une fois sur trois, la photo s'affiche bien, ne s'affiche pas , ou s'affiche en beaucoup trop petit !!
Dans le cas ci-dessous, une image aux dimensions de 640*425 s'affiche de trois façons différentes : - 220*165 (ce que je veux)
- 32*28
- 0*0
Ceci est la classe CSS pour la photo :
.cadre_photo
{
border : 3px;
border-style : double;
border-color : #000033;
max-width : 220px;
max-height : 300px;
width : expression(Math.min(this.width, 220));
height : expression(Math.min(this.height, 300));
}
J'affiche ensuite l'image dans le coprs de la page.
<img src="photos_etablissements/etablissement_<%=RS("id")%>.jpg" class="cadre_photo" />
Merci pour votre aide !!
Configuration: Windows XP Internet Explorer 6.0
Le problème dans ce code (est dans celui de l'autre post), c'est que la fonction qui récupère la taille de l'image ce fait au début du chargement de l'image, et non pas à la fin de celle-ci.
img.onload = function(){
/* code */
}
Soit (méthode moins "propre") de faire une oucle est d'attendre que l'image soit chargé : while(!img.complete){
/* On ne fait rien */
}
(méthode qui peut boucler indéfiniment si l'image ne se charge pas) |
Pour le onload, on passe une fonction qui sera exécutée à la fin du chargement de l'image. Si tu veut tester si le chargement marche bien, tu peut commencer par mettre un simple alert :
var img = new Image();
img.onload = function(){
alert('Image chargé');
}
img.src = 'monImage.jpg';
(on met le img.src apres avoir mis la fonction, au cas ou le navigateur charge l'image très vite, et qu'il n'ait pas encore de fonction a lancer) Apres, il suffit de mettre le code voulu dans la fonction, et celui-ci sera forcément exécuté quand l'image sera chargée. Ainsi, pas de risque de boucle infinie. |
Je pense avoir bien fait ce que tu m'a dits. Mais bien que le message d'alerte me dise bien que l'image est chargée, celle-ci n'est pas toujours ouverte.
function redimImage(inImg, inMW, inMH)
{
// Cette function recoit 3 parametres
// inImg : Chemin relatif de l'image
// inMW : Largeur maximale
// inMH : Hauteur maximale
var maxWidth = inMW;
var maxHeight = inMH;
// Declarations des variables "Nouvelle Taille"
var dW = 0;
var dH = 0;
// Declaration d'un objet Image
var oImg = new Image();
// Affectation du chemin de l'image a l'objet
oImg.onload = function()
{
alert('Image chargé');
}
oImg.src = inImg;
// On recupere les tailles reelles
var h = dH = oImg.height;
var w = dW = oImg.width;
// Si la largeur ou la hauteur depasse la taille maximale
if ((h >= maxHeight) || (w >= maxWidth)) {
// Si la largeur et la hauteur depasse la taille maximale
if ((h >= maxHeight) && (w >= maxWidth)) {
// On cherche la plus grande valeur
if (h > w) {
dH = maxHeight;
// On recalcule la taille proportionnellement
dW = parseInt((w * dH) / h, 10);
} else {
dW = maxWidth;
// On recalcule la taille proportionnellement
dH = parseInt((h * dW) / w, 10);
}
} else if ((h > maxHeight) && (w < maxWidth)) {
// Si la hauteur depasse la taille maximale
dH = maxHeight;
// On recalcule la taille proportionnellement
dW = parseInt((w * dH) / h, 10);
} else if ((h < maxHeight) && (w > maxWidth)) {
// Si la largeur depasse la taille maximale
dW = maxWidth;
// On recalcule la taille proportionnellement
dH = parseInt((h * dW) / w, 10);
}
}
// On ecrit l'image dans le document
document.writeln("<img src=\"" + inImg + "\" width=\"" + dW*2 + "\" height=\"" + dH*2 + "\" border=\"0\" class=\"cadre_photo\" >");
};
|
Je pense que l'affichage de ton image ne marche pas, car le traitement que tu fait, n'est pas mis dans la fonction onload.
|
Bon ben j'ai oublié, mais je me rattrape ce matin. Voila ta fonction modifié (par contre, le résultat attendu ne sera pas le même que ta fonction d'origine)
function redimImage(inImg, inMW, inMH){
// Cette function recoit 3 parametres
// inImg : Chemin relatif de l'image
// inMW : Largeur maximale
// inMH : Hauteur maximale
var maxWidth = inMW;
var maxHeight = inMH;
// Declarations des variables "Nouvelle Taille"
var dW = 0;
var dH = 0;
// Declaration d'un objet Image
var oImg = new Image();
// Enregistrement des varaibles sur l'image
oImg.maxWidth = inMW;
oImg.maxHeight = inMH;
oImg.onload = function(){
alert('Image chargé');
/* Quand on est dans une fonction évenement, du style onload, "this"
* correspond à l'objet qui possede la fonction. Dans notre cas, c'est l'image.
* De même, on est pas sûr de retrouver les variables de la fonction de départ.
*C'est pour cela que j'ai enregistré les tailles max dans l'objet l'image. */
// On recupere les tailles reelles
var h = dH = this.height;
var w = dW = this.width;
// Si la largeur ou la hauteur depasse la taille maximale
if ((h >= this.maxHeight) || (w >= this.maxWidth)) {
// Si la largeur et la hauteur depasse la taille maximale
if ((h >= this.maxHeight) && (w >= this.maxWidth)){
// On cherche la plus grande valeur
if (h > w) {
dH = this.maxHeight;
// On recalcule la taille proportionnellement
dW = parseInt((w * dH) / h, 10);
} else {
dW = this.maxWidth;
// On recalcule la taille proportionnellement
dH = parseInt((h * dW) / w, 10);
}
} else if ((h > this.maxHeight) && (w < this.maxWidth)) {
// Si la hauteur depasse la taille maximale
dH = this.maxHeight;
// On recalcule la taille proportionnellement
dW = parseInt((w * dH) / h, 10);
} else if ((h < this.maxHeight) && (w > this.maxWidth)) {
// Si la largeur depasse la taille maximale
dW =this.maxWidth;
// On recalcule la taille proportionnellement
dH = parseInt((h * dW) / w, 10);
}
// On ecrit l'image dans le document
document.writeln("<img src=\"" + inImg + "\" width=\"" + dW*2 + "\" height=\"" + dH*2 + "\" border=\"0\" class=\"cadre_photo\" >");
/* Attention, vu que l'on est dans une fonction évenement, on n'est plus a
* l'endroit ou l'on a exécuter le script. Le document.writeln risque d'écrire
* n'importe ou, et peut même remplacer le texte du document complet. */
}
}
// Affectation du chemin de l'image a l'objet
oImg.src = inImg;
};
Pour être sûr que l'image ce mette la ou tu veut, il vaudrait mieux lui dire dans quel objet la mettre. Pour l'instant tu doit faire comme cela : <body>
<div>
<script type="text/javascript">
redim('monImage.jpg', 100, 100);
</script>
</div>
</body>
Le mieux serait de faire ainsi : <body>
<div id="monConteneur">
</div>
<script type="text/javascript">
redim('monImage.jpg', 100, 100, 'monConteneur');
</script>
</body>
On rajouterai donc à la fonction, l'identifiant de l'objet qui va contenir l'image. Le document.writeln() serait remplacer par : // Récupération de l'objet conteneur
var conteneur = document.getElementById('monConteneur');
// On test si l'objet a bien été récupéré
if(conteneur){
// On met la taille à l'objet Image
oImg.width = dW*2;
oImg.height = dH*2;
// On ajout l'image à la fin du conteneur
conteneur.appendChild(oImg);
} |
Salut,
redim('monImage.jpg', 100, 100, 'monConteneur'); , je ne vois pas l'utilité du paramètre 'monConteneur' puisque qu'on l'appel directement dans la fonction grâce à
var conteneur = document.getElementById('monConteneur');. |
En fait, pour prendre correctement en compte le passage de l'identifiant du conteneur, il faut faire quelque modification.
function redimImage(inImg, inMW, inMH){
devient function redimImage(inImg, inMW, inMH, conteneur){
en même temps que l'on fait oImg.maxWidth = inMW; oImg.maxHeight = inMH; on rajoute oImg.conteneur = conteneur; et au lieu de faire var conteneur = document.getElementById('monConteneur');
on fera var conteneur = document.getElementById(oImog.conteneur); Comme ca, la fonction devient utilisable pour plusieurs conteneur différent, et plus seulement pour un seul. |
Rhhaaaaaaaaaaaaaaa !!!!!!!!!!!!!!!!
|
En fait, la photo s'affiche correctement ou ne s'affiche pas du tout.
function redimImage(inImg, inMW, inMH, conteneur){
// Cette function recoit 3 parametres
// inImg : Chemin relatif de l'image
// inMW : Largeur maximale
// inMH : Hauteur maximale
var maxWidth = inMW;
var maxHeight = inMH;
// Declarations des variables "Nouvelle Taille"
var dW = 0;
var dH = 0;
// Declaration d'un objet Image
var oImg = new Image();
// Enregistrement des varaibles sur l'image
oImg.maxWidth = inMW;
oImg.maxHeight = inMH;
oImg.conteneur = conteneur;
oImg.onload = function(){
/* Quand on est dans une fonction évenement, du style onload, "this"
* correspond à l'objet qui possede la fonction. Dans notre cas, c'est l'image.
* De même, on est pas sûr de retrouver les variables de la fonction de départ.
*C'est pour cela que j'ai enregistré les tailles max dans l'objet l'image. */
// On recupere les tailles reelles
var h = dH = this.height;
var w = dW = this.width;
// Si la largeur ou la hauteur depasse la taille maximale
if ((h >= this.maxHeight) || (w >= this.maxWidth)) {
// Si la largeur et la hauteur depasse la taille maximale
if ((h >= this.maxHeight) && (w >= this.maxWidth)){
// On cherche la plus grande valeur
if (h > w) {
dH = this.maxHeight;
// On recalcule la taille proportionnellement
dW = parseInt((w * dH) / h, 10);
} else {
dW = this.maxWidth;
// On recalcule la taille proportionnellement
dH = parseInt((h * dW) / w, 10);
}
} else if ((h > this.maxHeight) && (w < this.maxWidth)) {
// Si la hauteur depasse la taille maximale
dH = this.maxHeight;
// On recalcule la taille proportionnellement
dW = parseInt((w * dH) / h, 10);
} else if ((h < this.maxHeight) && (w > this.maxWidth)) {
// Si la largeur depasse la taille maximale
dW =this.maxWidth;
// On recalcule la taille proportionnellement
dH = parseInt((h * dW) / w, 10);
}
// On ecrit l'image dans le document
// Récupération de l'objet conteneur
var conteneur = document.getElementById(oImg.conteneur);
// On test si l'objet a bien été récupéré
if(conteneur)
{
// On met la taille à l'objet Image
oImg.width = dW*2;
oImg.height = dH*2;
// On ajout l'image à la fin du conteneur
conteneur.appendChild(oImg);
}
}
}
// Affectation du chemin de l'image a l'objet
oImg.src = inImg;
};
Mon appel de fonction entre <body> et </body> :
<div id="monConteneur" class="cadre_photo">
<script type="text/javascript">
<!--
redimImage('photos_etablissements/etablissement_<%=id%>.jpg', 110, 90, 'monConteneur');
//-->
</script>
</div>
|
Je pousse un grand OUUUUUUF !!!!!
|
Holà, ça fait longtemps cette discutions.
|
Justement , j'ai une sorte de blog, donc c'est pour chaque post, donc il me faut un conteneur différent ...
|