Dessiner une image à partir d'une URL de données vers un canevas

112

Comment ouvrir une image dans un canevas? qui est encodé

J'utilise le

var strDataURI = oCanvas.toDataURL(); 

La sortie est l'image encodée en base 64. Comment dessiner cette image sur une toile?

Je veux utiliser strDataURI et créer l'image? Est-ce poosible?
Si ce n'est pas le cas, quelle peut être la solution pour charger l'image sur une toile?

Yahoo
la source
Cela ne fonctionne pas dans ce cas :: jsfiddle.net/V92Gn/5376
arqam

Réponses:

194

Étant donné une URL de données, vous pouvez créer une image (sur la page ou purement dans JS) en définissant le srcde l'image sur votre URL de données. Par exemple:

var img = new Image;
img.src = strDataURI;

La drawImage()méthode HTML5 Canvas Context vous permet de copier tout ou une partie d'une image (ou d'un canevas ou d'une vidéo) sur un canevas.

Vous pouvez l'utiliser comme ceci:

var myCanvas = document.getElementById('my_canvas_id');
var ctx = myCanvas.getContext('2d');
var img = new Image;
img.onload = function(){
  ctx.drawImage(img,0,0); // Or at whatever offset you like
};
img.src = strDataURI;

Edit : J'ai précédemment suggéré dans cet espace qu'il pourrait ne pas être nécessaire d'utiliser le onloadgestionnaire lorsqu'un URI de données est impliqué. Sur la base des tests expérimentaux de cette question , il n'est pas sûr de le faire. La séquence ci-dessus - créer l'image, définir le onloadpour utiliser la nouvelle image, puis définir la src- est nécessaire pour que certains navigateurs utilisent sûrement les résultats.

Phrogz
la source
5
L'utilisation du gestionnaire onload est certainement une bonne idée. Le chargement de l'image peut prendre un certain temps, il est donc préférable de jouer en toute sécurité. :)
Juho Vepsäläinen
1
@bebraw Voyons cela avec certitude: stackoverflow.com/questions/4776670/… :)
Phrogz
@Phrogz cela me donne une erreur: var ctx = myCanvas.getContext ('2d'); il suffit de copier / coller votre code pour tester
Jepser Bernardino
@jepser Avez-vous un canvasélément sur votre page avec cet identifiant? Vous êtes-vous assuré que ce myCanvasn'est pas nul? Si vous rencontrez toujours des problèmes, postez votre propre question ou accédez au canal de discussion JavaScript .
Phrogz
@DavidMurdoch Excellente information. Avez-vous un bogue Chromium auquel vous pourriez créer un lien, afin que les utilisateurs sachent quand la déclaration ci-dessus n'est plus vraie?
Phrogz
11
function drawDataURIOnCanvas(strDataURI, canvas) {
    "use strict";
    var img = new window.Image();
    img.addEventListener("load", function () {
        canvas.getContext("2d").drawImage(img, 0, 0);
    });
    img.setAttribute("src", strDataURI);
}
Raphaël C
la source
2

Peut-être que ce violon aiderait ThumbGen - jsFiddle Il utilise File API et Canvas pour générer dynamiquement des vignettes d'images.

(function (doc) {
    var oError = null;
    var oFileIn = doc.getElementById('fileIn');
    var oFileReader = new FileReader();
    var oImage = new Image();
    oFileIn.addEventListener('change', function () {
        var oFile = this.files[0];
        var oLogInfo = doc.getElementById('logInfo');
        var rFltr = /^(?:image\/bmp|image\/cis\-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x\-cmu\-raster|image\/x\-cmx|image\/x\-icon|image\/x\-portable\-anymap|image\/x\-portable\-bitmap|image\/x\-portable\-graymap|image\/x\-portable\-pixmap|image\/x\-rgb|image\/x\-xbitmap|image\/x\-xpixmap|image\/x\-xwindowdump)$/i
        try {
            if (rFltr.test(oFile.type)) {
                oFileReader.readAsDataURL(oFile);
                oLogInfo.setAttribute('class', 'message info');
                throw 'Preview for ' + oFile.name;
            } else {
                oLogInfo.setAttribute('class', 'message error');
                throw oFile.name + ' is not a valid image';
            }
        } catch (err) {
            if (oError) {
                oLogInfo.removeChild(oError);
                oError = null;
                $('#logInfo').fadeOut();
                $('#imgThumb').fadeOut();
            }
            oError = doc.createTextNode(err);
            oLogInfo.appendChild(oError);
            $('#logInfo').fadeIn();
        }
    }, false);
    oFileReader.addEventListener('load', function (e) {
        oImage.src = e.target.result;
    }, false);
    oImage.addEventListener('load', function () {
        if (oCanvas) {
            oCanvas = null;
            oContext = null;
            $('#imgThumb').fadeOut();
        }
        var oCanvas = doc.getElementById('imgThumb');
        var oContext = oCanvas.getContext('2d');
        var nWidth = (this.width > 500) ? this.width / 4 : this.width;
        var nHeight = (this.height > 500) ? this.height / 4 : this.height;
        oCanvas.setAttribute('width', nWidth);
        oCanvas.setAttribute('height', nHeight);
        oContext.drawImage(this, 0, 0, nWidth, nHeight);
        $('#imgThumb').fadeIn();
    }, false);
})(document);

la source
0

Vous voudrez peut-être effacer l'ancienne image avant de définir une nouvelle image.

Vous devez également mettre à jour la taille du canevas pour une nouvelle image.

Voici comment je fais dans mon projet:

    // on image load update Canvas Image 
    this.image.onload = () => {

      // Clear Old Image and Reset Bounds
      canvasContext.clearRect(0, 0, this.canvas.width, this.canvas.height);
      this.canvas.height = this.image.height;
      this.canvas.width = this.image.width;

      // Redraw Image
      canvasContext.drawImage(
        this.image,
        0,
        0,
        this.image.width,
        this.image.height
      );
    };
Hitesh Sahu
la source
-4

en javascript, en utilisant jquery pour la sélection de l'identifiant du canevas:

 var Canvas2 = $("#canvas2")[0];
        var Context2 = Canvas2.getContext("2d");
        var image = new Image();
        image.src = "images/eye.jpg";
        Context2.drawImage(image, 0, 0);

html5:

<canvas id="canvas2"></canvas>
user475434
la source
1
Cela ne répond pas à la question du PO relative à l'URL de données.
Phrogz
7
Pourquoi utiliseriez-vous jQuery pour sélectionner le canevas? Taper document.getElementById () est-il trop de travail?
Scott
Ce code fonctionne, bien qu'il ne soit pas lié à la question
Mohammad Ashfaq