2010-08-11 10 views
1

Voici le code qui fonctionne parfaitement bien dans Firefox, mais je ne comprends pas pourquoi cela ne fonctionne pas dans les navigateurs Webkit! Remarque: Im utilisant jQuery pour sélectionner l'élément canvas.HTML5 Canvas flip fonction verticale fonctionne dans Firefox mais pas Chrome ou Safari. Pourquoi?

(function() 
    { 
     flipV=function(imageData) 
     { 
      var n = new Array(); 
      var d = imageData.data; 
     // loop through over row of pixels 
      for (var row=0;row<imageData.height;row++) 
      { 
      // loop over every column 
       for (var col=0;col<imageData.width;col++) 
       { 
        var si,di,sp,dp; 

       // source pixel 
        sp=(imageData.width*row)+col; 

       // destination pixel 
       dp=(imageData.width*((imageData.height-1)-row))+col; 

       // source and destination indexes, will always reference the red pixel 
       si=sp*4; 
        di=dp*4; 

        n[di]=d[si]; // red 
        n[di+1]=d[si+1]; // green 
        n[di+2]=d[si+2]; // blue 
        n[di+3]=d[si+3]; // alpha 
       } 
      } 
      imageData.data=n; 

      return imageData; 
     }; 

     var imgs = ['/images/myimage.png']; 

     var $c=$('#canvas'); 
     var cxt=$c[0].getContext('2d'); 


     var w=$c.width(); 
     var h=$c.height(); 

     var img1 = new Image(); 
     img1.onload=function() 
     { 
      cxt.drawImage(img1,0,0,img1.width,img1.height,0,0,w,h); 
      imageData = flipV(cxt.getImageData(0,0,w,h)); 
      cxt.putImageData(imageData,0,0) 

     }; 
     img1.src=imgs[0]; 

    } 
)(); 

Répondre

3

Edit: Je joue avec cela un peu, et ai eu à travailler. Le problème est quand quand vous définissez imageData.data = n. Il semble que Chrome/WebKit ne fonctionne pas avec un autre tableau data. Pour que cela fonctionne, j'ai passé l'objet de contexte à flipV et j'ai appelé createImageData(imageData.width, imageData.height) pour obtenir un nouvel objet ImageData, définir n = newImageData.data et renvoyer newImageData.

Je vais laisser le reste ici pour référence:

Il y a un moyen plus facile et très probablement plus rapide pour retourner une image cependant, qui fonctionnera à travers les domaines. Vous pouvez utiliser la fonction scale pour retourner automatiquement tout ce que vous dessinez sur l'axe y. Vous avez juste besoin d'être sûr d'appeler save() et restore() et n'oubliez pas d'ajuster l'emplacement puisque tout est retourné.

function drawVFlipped(ctx, img) { 
    ctx.save(); 
    // Multiply the y value by -1 to flip vertically 
    ctx.scale(1, -1); 
    // Start at (0, -height), which is now the bottom-left corner 
    ctx.drawImage(img, 0, -img.height); 
    ctx.restore(); 
} 
+0

@Mathew En fait, les autres filtres que j'utilise getImageData(), tels que l'échelle de gris ou l'invert, fonctionnent parfaitement avec les images locales. Il semble être juste ce filtre flipV qui a un problème. J'avais déjà essayé la mise à l'échelle négative mais j'avais des problèmes avec un "INDEX_SIZE_ERR". Je me rends compte que c'est parce que j'utilise drawImage pour recadrer la source et placer la - sur la mauvaise hauteur var. Vous avez raison de dire que la mise à l'échelle négative est une méthode beaucoup plus simple que la modification d'imageData, bien que je veuille encore savoir pourquoi mon filtre fonctionne en FF et non en Webkit. – talentedmrjones

+1

J'avais l'impression que ce nouveau tableau pourrait avoir quelque chose à voir avec ça. Merci d'avoir expérimenté et confirmé! Vous avez en effet raison de dire que la mise à l'échelle négative est une façon bien meilleure, plus facile et plus élégante de gérer le flip, donc je vais continuer avec cette méthode. – talentedmrjones

Questions connexes