Veri URL'sinden bir tuvale görüntü çizme


112

Kanvas içindeki bir resmi nasıl açabilirim? hangisi kodlanmış

Kullanıyorum

var strDataURI = oCanvas.toDataURL(); 

Çıktı, kodlanmış temel 64 görüntüdür. Bu resmi bir tuvale nasıl çizebilirim?

strDataURI Görüntüyü kullanmak ve oluşturmak istiyorum ? Zavallı mı?
Öyleyse, görüntüyü bir tuvale yüklemek için çözüm ne olabilir?


Bu durumda çalışmıyor :: jsfiddle.net/V92Gn/5376
arqam

Yanıtlar:


195

Bir veri URL'si verildiğinde, görseli veri URL'nize ayarlayarak bir görüntü (sayfada veya tamamen JS'de) srcoluşturabilirsiniz. Örneğin:

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

drawImage()Yöntem HTML5 Canvas Bağlamında size bir tuval üzerine tümünü veya bir görüntü (ya tuval veya video) bir kısmını kopyalama sağlar.

Bunu şu şekilde kullanabilirsiniz:

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;

Düzenleme : Bu alanda daha önce onloadbir veri URI'si söz konusu olduğunda işleyiciyi kullanmanın gerekmeyebileceğini ileri sürmüştüm . Bu sorudaki deneysel testlere göre bunu yapmak güvenli değildir. Yukarıdaki sıra - görüntüyü oluşturun, onloadyeni görüntüyü kullanacak şekilde ayarlayın ve sonra ayarlayın src- bazı tarayıcıların sonuçları kesinlikle kullanması için gereklidir.


5
Yükleme işleyicisini kullanmak kesinlikle iyi bir fikirdir. Görüntüyü yüklemek biraz zaman alabilir, bu yüzden güvenli bir şekilde oynatmak daha iyidir. :)
Juho Vepsäläinen

1
@bebraw Şunu kesin olarak görelim: stackoverflow.com/questions/4776670/… :)
Phrogz

@Phrogz bana bir hata veriyor: var ctx = myCanvas.getContext ('2d'); test etmek için kodunuzu kopyalamanız /
yapıştırmanız yeterli

@jepser canvasSayfanızda bu kimliğe sahip bir öğe var mı? Bunun myCanvasboş olmadığından emin misiniz ? Hala sorun yaşıyorsanız, kendi sorunuzu gönderin veya JavaScript sohbet kanalına gelin .
Phrogz

@DavidMurdoch Harika bilgiler. Kullanıcıların yukarıdaki ifadenin artık doğru olmadığını anlayabilmesi için bağlantı kurabileceğiniz bir Chromium hatanız var mı?
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);
}

2

Belki de bu keman, ThumbGen'e yardımcı olabilir - jsFiddle Görüntülerin küçük resimlerini dinamik olarak oluşturmak için Dosya API'sini ve Tuval'i kullanır.

(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);

0

Yeni bir Görüntü ayarlamadan önce eski Görüntüyü temizlemek isteyebilirsiniz.

Ayrıca yeni bir Görüntü için Tuval boyutunu güncellemeniz gerekir.

Projemde böyle yapıyorum:

    // 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
      );
    };

-4

javascript'te, tuval kimliği seçimi için jquery kullanarak:

 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>

1
Bu, OP'nin dataURL ile ilgili sorusuna cevap vermez.
Phrogz

7
Tuvali seçmek için neden jQuery kullanmalısınız? Document.getElementById () yazmak çok mu iş?
Scott

Soru ile ilgili olmasa da bu kod işe yarıyor
Mohammad Ashfaq
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.