การวาดภาพจาก URL ข้อมูลไปยังผืนผ้าใบ


112

ฉันจะเปิดภาพใน Canvas ได้อย่างไร ซึ่งเข้ารหัส

ฉันใช้ไฟล์

var strDataURI = oCanvas.toDataURL(); 

ผลลัพธ์คืออิมเมจ 64 ฐานที่เข้ารหัส ฉันจะวาดภาพนี้บนผืนผ้าใบได้อย่างไร?

ฉันต้องการใช้strDataURI และสร้างภาพหรือไม่ มันเซ่อ?
หากไม่เป็นเช่นนั้นสิ่งที่เป็นไปได้สำหรับการโหลดภาพบนผืนผ้าใบ?


มันไม่ทำงานในกรณีนี้ :: jsfiddle.net/V92Gn/5376
arqam

คำตอบ:


195

ด้วย URL ข้อมูลคุณสามารถสร้างรูปภาพ (ไม่ว่าจะบนเพจหรือใน JS ทั้งหมด) โดยตั้งค่าsrcรูปภาพเป็น URL ข้อมูลของคุณ ตัวอย่างเช่น:

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

drawImage()วิธีการของผ้าใบ HTML5 บริบทช่วยให้คุณสามารถคัดลอกทั้งหมดหรือบางส่วนของภาพ (หรือผ้าใบหรือวิดีโอ) ลงบนผืนผ้าใบ

คุณอาจใช้มันดังนี้:

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;

แก้ไข : ก่อนหน้านี้ฉันเคยแนะนำในพื้นที่นี้ว่าอาจไม่จำเป็นต้องใช้onloadตัวจัดการเมื่อมี URI ข้อมูลเข้ามาเกี่ยวข้อง จากการทดสอบทดลองจากคำถามนี้ไม่ปลอดภัยที่จะทำเช่นนั้น ลำดับข้างต้น - สร้างภาพตั้งค่าonloadให้ใช้ภาพใหม่จากนั้นตั้งค่าsrc- จำเป็นสำหรับเบราว์เซอร์บางตัวที่จะใช้ผลลัพธ์อย่างแน่นอน


5
การใช้ onload handler เป็นความคิดที่ดี อาจใช้เวลาโหลดรูปภาพสักครู่จึงจะดีกว่าที่จะเล่นอย่างปลอดภัย :)
Juho Vepsäläinen

1
@bebraw มาดูกันแน่นอน: stackoverflow.com/questions/4776670/… :)
Phrogz

@Phrogz มันทำให้ฉันมีข้อผิดพลาด: var ctx = myCanvas.getContext ('2d'); เพียงคัดลอก / วางรหัสของคุณเพื่อทดสอบ
Jepser Bernardino

@jepser คุณมีcanvasองค์ประกอบบนเพจของคุณด้วย id นั้นหรือไม่? คุณมั่นใจmyCanvasหรือไม่ว่าไม่เป็นโมฆะ? หากคุณยังคงมีปัญหาในการโพสต์คำถามของคุณเองหรือมาถึงช่อง JavaScript แชท
Phrogz

@DavidMurdoch ข้อมูลดีๆ คุณมีข้อบกพร่องของ Chromium ที่สามารถเชื่อมโยงได้หรือไม่เพื่อให้ผู้ใช้ทราบเมื่อข้อความข้างต้นไม่เป็นความจริงอีกต่อไป
Phrogz


2

บางทีซอนี้อาจช่วยThumbGen - jsFiddle ได้โดยใช้ File API และ Canvas เพื่อสร้างภาพขนาดย่อของภาพแบบไดนามิก

(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

คุณอาจต้องการล้างรูปภาพเก่าก่อนตั้งค่ารูปภาพใหม่

คุณต้องอัปเดตขนาด Canvas สำหรับรูปภาพใหม่

นี่คือวิธีที่ฉันทำในโครงการของฉัน:

    // 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 โดยใช้ jquery สำหรับการเลือก canvas id:

 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
สิ่งนี้ไม่ตอบคำถามของ OP ที่เกี่ยวข้องกับ dataURL
Phrogz

7
ทำไมคุณถึงใช้ jQuery เพื่อเลือกแคนวาส การพิมพ์ document.getElementById () ทำงานมากเกินไปหรือไม่
Scott

รหัสนี้ใช้งานได้แม้ว่าจะไม่เกี่ยวข้องกับคำถามก็ตาม
Mohammad Ashfaq
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.