Jak dodać obraz do płótna


106

Trochę eksperymentuję z nowym elementem canvas w HTML.

Chcę po prostu dodać obraz do płótna, ale z jakiegoś powodu nie działa.

Mam następujący kod:

HTML

<canvas id="viewport"></canvas>

CSS

canvas#viewport { border: 1px solid white; width: 900px; }

JS

var canvas = document.getElementById('viewport'),
context = canvas.getContext('2d');

make_base();

function make_base()
{
  base_image = new Image();
  base_image.src = 'img/base.png';
  context.drawImage(base_image, 100, 100);
}

Obraz istnieje i nie ma błędów JavaScript. Obraz po prostu się nie wyświetla.

To musi być coś naprawdę prostego, za czym tęskniłem ...

Odpowiedzi:


219

Może powinieneś poczekać, aż obraz zostanie załadowany, zanim go narysujesz. Spróbuj tego zamiast tego:

var canvas = document.getElementById('viewport'),
context = canvas.getContext('2d');

make_base();

function make_base()
{
  base_image = new Image();
  base_image.src = 'img/base.png';
  base_image.onload = function(){
    context.drawImage(base_image, 0, 0);
  }
}

To znaczy narysuj obraz w wywołaniu zwrotnym obrazu.


6
@swogger raczej dziękuję, zapytaj o wszystko, wypróbuj. To działało doskonale. Upewnij się, że najpierw sprawdziłeś rozmiar img źródła, w przeciwnym razie zostanie przycięty, chyba że używasz pełnej funkcji context.drawImage(base_image, 0, 0, 200, 200);. To spowodowałoby rysowanie base_img z pozycji 0px, z obszarem rysowania 200x200px.
m3nda

1
To był dokładnie mój przypadek. Ładowałem dane blob do kanwy new Imagei zastanawiałem się, dlaczego zawsze wyświetlał poprzedni obraz. Okazuje się, że nawet jeśli ładuję obraz ze zmiennej, nadal muszę czekać, aż to onloadsię stanie. Dziękuję Ci!
aexl

Jak dodać styl obrazu?
Sagar Rawal

6

oto przykładowy kod do rysowania obrazu na płótnie-

$("#selectedImage").change(function(e) {

var URL = window.URL;
var url = URL.createObjectURL(e.target.files[0]);
img.src = url;

img.onload = function() {
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");        

    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.drawImage(img, 0, 0, 500, 500);
}});

W powyższym kodzie selectedImage jest kontrolką wejściową, której można użyć do przeglądania obrazu w systemie. Aby uzyskać więcej informacji na temat przykładowego kodu do rysowania obrazu na płótnie przy zachowaniu współczynnika proporcji:

http://newapputil.blogspot.in/2016/09/show-image-on-canvas-html5.html


1

W moim przypadku pomyliłem się z parametrami funkcji, którymi są:

context.drawImage(image, left, top);
context.drawImage(image, left, top, width, height);

Jeśli tego oczekujesz

context.drawImage(image, width, height);

umieścisz obraz tuż poza obszarem roboczym z tymi samymi efektami, jak opisano w pytaniu.


0

Musisz użyć .onload

let canvas = document.getElementById("myCanvas");
let ctx = canvas.getContext("2d"); 

const drawImage = (url) => {
    const image = new Image();
    image.src = url;
    image.onload = () => {
       ctx.drawImage(image, 0, 0)
    }
}

Dlatego

Jeśli wczytujesz obraz najpierw po utworzeniu płótna, płótno nie będzie w stanie przekazać wszystkich danych obrazu w celu narysowania obrazu. Musisz więc najpierw załadować wszystkie dane, które przyszły z obrazem, a następnie możesz użyć drawImage ()

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.