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

JavaScript Discussion :

Redim image lent sur Chrome


Sujet :

JavaScript

  1. #1
    Membre régulier Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 73
    Points
    73
    Par défaut Redim image lent sur Chrome
    Bonjour à tous,

    j'ai un problème sur une petite application avec zoom à la molette de souris. La photo à zoomer/dézoomer est grande. Sur Chrome, cela fonctionne parfaitement jusqu'à ce que je fasse perdre puis reprendre le focus à la fenêtre. A partir de là, il se passe 5 à 10 secondes où ça rame vraiment puis tout rentre dans l'ordre.
    Cela ne vient pas de l'évènement mousewheel, car le problème est le même avec des boutons. Il semble que Chrome n'ait plus l'image en mémoire et qu'il qu'il lui faut un moment pour la retrouver (???).
    Aucun souci sur IE et FF.

    Toute aide sera la bienvenue, merci

    BK

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 642
    Points : 66 668
    Points
    66 668
    Billets dans le blog
    1
    Par défaut
    et donc le jeu est d'essayer de deviner le code utilisé ?

  3. #3
    Membre régulier Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 73
    Points
    73
    Par défaut
    ça ne semble pas venir du code puisque c'est juste la modif du height et du width d'une image. Voici un petit bout de code qui fait ressortir le problème.

    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
    window.onload = function() {
    	var currentZoom = 100;
    	h = document.getElementById('im').width;
    	w = document.getElementById('im').height;
     
    	function wheel(event){
    		var delta = 0;
    		if (!event) event = window.event;
    		if (event.wheelDelta) {
    			delta = event.wheelDelta/120; 
    		} else if (event.detail) {
    			delta = -event.detail/3;
    		}
    		if (delta) {
    			zzoom(delta);
    		}
    	}
     
    	function zzoom(z) {
    		if ((currentZoom+z)<=10) z=currentZoom+z;
    		else
    		z = Math.round(currentZoom*(1+z*5/100));
    		document.getElementById('im').width = h*z/100;
    		document.getElementById('im').height = w*z/100;
    		currentZoom = z;
    	}
     
    	if (window.addEventListener)
    		window.addEventListener('DOMMouseScroll', wheel, false);
     
    	if (typeof(window.onmousewheel)=='undefined')
    	document.onmousewheel = wheel;
    	else
    	window.onmousewheel = wheel;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img id='im' src="monimage.jpg" />
    L'image fait 2700 x 1900 pixels. Comme je l'ai dit, le mousewheel n'est pas en cause.

    merci
    BK

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Points : 545
    Points
    545
    Par défaut
    D’après les symptômes que tu décris, cela ressemble fort à un swap mémoire.

    A mon avis, le fait de manipuler ton image avec le DOM, n’aide pas. Le moteur de rendu html de Chrome (WebKit) n’est pas adapter pour ce genre d’opération.
    Je te conseil d’utiliser un moteur de rendu vectoriel, pour Chrome ils en existent au moins 4 :
    • Le context 2D de la balise canvas
    • Le context WebGL de la balise canvas
    • Le moteur de rendu Flash
    • Le moteur de rendu SVG

  5. #5
    Membre régulier Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 73
    Points
    73
    Par défaut
    Le problème vient du moteur de rendu de Chrome qui applique un rééchantillonage à l'image (resampling) qui d'ailleurs donne un résultat assez impressionnant. Mais quand ce rendu a été appliqué (après un petit timeout), l'image originale est virée de la mémoire et elle est recalculée systématiquement, ce qui consomme de la CPU.
    Il y a une solution qui consiste à forcer Chrome à ne pas rééchantilloner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img style="image-rendering:-webkit-optimize-contrast;"
    Je vais voir si on peut modifier dynamiquement ce style après un timeout pour profiter quand même du rendu.

    BK

  6. #6
    Membre régulier Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 73
    Points
    73
    Par défaut
    oui on peut avec style.imageRendering

    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
    window.onload = function() {
    	var currentZoom = 100;
    	var renderingTimer;
    	h = document.getElementById('im').width;
    	w = document.getElementById('im').height;
     
    	function wheel(event){
    		var delta = 0;
    		if (!event) event = window.event;
    		if (event.wheelDelta) {
    			delta = event.wheelDelta/120; 
    		} else if (event.detail) {
    			delta = -event.detail/3;
    		}
    		if (delta) {
    			zzoom(delta);
    		}
    	}
     
    	function zzoom(z) {
    		clearTimeout(renderingTimer);
    		document.getElementById('im').style.imageRendering='-webkit-optimize-contrast';
    		if ((currentZoom+z)<=10) z=currentZoom+z;
    		else
    		z = Math.round(currentZoom*(1+z*5/100));
    		document.getElementById('im').width = h*z/100;
    		document.getElementById('im').height = w*z/100;
    		currentZoom = z;
    		renderingTimer = setTimeout(function () {document.getElementById('im').style.imageRendering='auto'}, 700); // applique rendu Chrome au bout de 700 ms
    	}
     
    	if (window.addEventListener)
    		window.addEventListener('DOMMouseScroll', wheel, false);
     
    	if (typeof(window.onmousewheel)=='undefined')
    	document.onmousewheel = wheel;
    	else
    	window.onmousewheel = wheel;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img id='im' src="monimage.jpg" style="image-rendering:-webkit-optimize-contrast;" />
    Pour ceux que ça interesse et pour Chrome uniquement (Safari pas testé)

    BK

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

Discussions similaires

  1. [jcrop.js] Réouverture image identique impossible sur chrome et safari
    Par setni dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 11/03/2015, 18h19
  2. Background-image bug sur chrome
    Par helkøwsky dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/02/2013, 19h10
  3. [Servlet] [Image] Dessiner sur une image
    Par gaia_dev dans le forum 2D
    Réponses: 5
    Dernier message: 01/09/2004, 17h11
  4. BDE lent sur XP PRO
    Par Daniel Nespoulous dans le forum Bases de données
    Réponses: 4
    Dernier message: 11/06/2004, 14h12
  5. [Servlet][Deb]envoyer image gif sur le flux http
    Par ptitBoutchou dans le forum Servlets/JSP
    Réponses: 15
    Dernier message: 09/04/2004, 10h12

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