Подтвердить что ты не робот

Удаление изображения с холста в HTML5

есть пример, который загружает 2 изображения:

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

    var img1 = new Image();
    img.src = "/path/to/image/img1.png";
    img.onload = function() {
      ctx.drawImage(img, 0, 0);
    };

    var img2 = new Image();
    img2.src = "/path/to/image/img2.png";
    img2.onload = function() {
      ctx.drawImage(img2, 100, 100);
    };

Мне нужно удалить (заменить) img2 с холста. Что такое лучший способ сделать это?

4b9b3361

Ответ 1

Не понятно, что вы хотите, чтобы холст показывал, когда изображение ушло. Если вы хотите, чтобы он был прозрачным, вы могли получить данные изображения и заполнить его прозрачными пикселями:

var img = ctx.createImageData(w, h);
for (var i = img.data.length; --i >= 0; )
  img.data[i] = 0;
ctx.putImageData(img, 100, 100);

где "w" и "h" будут шириной и высотой исходного изображения.

edit — если вам просто нужен другой образ, почему бы просто не поместить его туда? Он будет перезаписывать все пиксели на холсте.

Ответ 2

Я думаю, может быть, вы неправильно поняли, что такое Canvas.

Холст по существу представляет собой двумерную сетку пикселей вдоль оси "X" и "Y". Вы используете API для рисования пикселей на этом холсте, поэтому, когда вы рисуете изображение, вы в основном рисуете пиксели, которые составляют это изображение на вашем холсте. Причина есть метод NO, который позволяет просто удалить изображение, потому что Canvas не знает там изображения, в первую очередь, он просто видит пиксели.

Это не похоже на HTML DOM (Document Object Model), где все является элементом HTML, или фактической "вещью", с которой вы можете взаимодействовать, событиями подключения script и т.д. это не так с материалом вы рисуете на холсте. Когда вы нарисовываете "вещь" на холсте, эта вещь не становится чем-то, на что вы можете нацелиться или зацепиться, это просто пиксели. Чтобы получить "вещь" , вам нужно каким-то образом представить свою "вещь" , например объект JavaScript, и сохранить коллекцию этих объектов JS где-нибудь. Это как работает Canvas. Это отсутствие DOM-подобной структуры для Canvas делает рендеринг очень быстрым, но может быть болью для реализации элементов пользовательского интерфейса, с которыми вы можете легко входить и взаимодействовать, удалять и т.д. Для этого вы можете попробовать SVG.

Чтобы ответить на ваш вопрос, просто нарисуйте прямоугольник на вашем холсте, который покрывает ваше изображение, используя те же координаты и размеры X/Y, которые вы использовали для вашего исходного изображения, или попробуйте решение Pointy. "Cover-up", вероятно, является неправильной терминологией, поскольку вы фактически заменяете пиксели (в Canvas нет слоев).

Ответ 3

Если то, что сказал "Sunday Ironfoot", верно, тогда лучший способ удалить изображение - это снова рисовать изображения с нуля. Для этого вам нужно иметь массив изображений и рисовать только те, которые вы используете. Например,

function EmptyClass{};
var img=new Array();
img[0]=new EmptyClass;
img[0].i=new Image();
img[0].src="yourfile1.jpg";
img[0].enabled=true;

img[1]=new EmptyClass;
img[1].i=new Image();
img[1].src="yourfile2.jpg";
img[1].enabled=false;// <-------- not enabled, should not be drawn equivalent to removing


img[2]=new EmptyClass;
img[2].i=new Image();
img[2].src="yourfile3.jpg";
img[2].enabled=true;

for(var i=0;i<3;i++){
if(img[i].enabled)ctx.drawImage(img[i], 100, 100);
}

P.S. Я создаю движок для javascript canvas. Будет опубликован в течение недели

Мир

Ответ 4

Вы можете использовать функцию clearRect(), чтобы очистить область изображения. Затем, очищая весь контекст, вы можете очистить только область изображения, используя это:

ctx.clearRect(xcoordinate_of_img1,ycoordinate_of_img1,xcoordinate_of_img1 + img1.width ,ycoord_of_img1 +img1.height );

Ответ 5

В отличие от самих вещей рисования, если вы замените "изображение на холсте", старый все еще существует.

Canvas c2;
...
        if (null != Image2) {
            var ctx = c2.getContext("2d");
            ctx.clearRect(0, 0, c2.width, c2.height);
        }

Ответ 6

Можете ли вы наложить объекты холста (я думаю, я должен попробовать, прежде чем спрашивать, вы можете один из меня быть ленивым). Думаю, мне было бы интересно иметь один элемент canvas в качестве фона, а затем еще один для объектов слоя, которые появляются и исчезают из вида. Может быть, немного более эффективно, после чего придется перерисовывать каждое изображение, если его удаляют или перемещают. Я буду играть и посмотреть, что я могу найти.