2014-09-13 4 views
1

Я делаю приложение, и мне нужно сохранить «моментальные снимки» на холсте, чтобы потом использовать их.Самый эффективный способ хранения раздела холста?

В настоящее время я превращаю холст в dataUrl, создавая с ним «новое изображение()» и сохраняя его в массиве. Но это оказывается довольно медленным, и вроде бы замораживает приложение на долю секунды, когда это происходит.

Есть одна проблема, о которой я знаю; он сохраняет весь холст, в то время как мне нужно только сохранить небольшой его фрагмент.

Итак, есть ли более быстрый способ сохранить текущий холст или есть способ превратить только небольшой раздел в dataUrl без создания новых холстов каждый раз?

+0

Каковы размеры 1) холст и 2) малые секции? – GameAlchemist

+0

@GameAlchemist Они оба различаются. Холст в основном около 1000x1000, разделы, как правило, от 50x50 до 500x500, я думаю. – user3032989

ответ

1

Вы можете создать холст размером области, которую вы хотите сохранить:

var save_area = document.createElement("canvas"); 
save_area.width = x1 - x0; 
save_area.height = y1 - y0; 

Вы рисуете оригинальный холст в области сохранения, переведенный (-x0, -y0) так, что часть вы заинтересованы в том, Скопировано в save_area пикселей.

save_area.getContext("2d").drawImage(original_canvas, -x0, -y0); 

Чтобы восстановить только отдернуть save_area в холст после первой очистки пораженного участка (это необходимо, чтобы правильно обрабатывать прозрачность).

original_canvas_context.clearRect(x0, y0, x1-x0, y1-y0); 
original_canvas_context.drawImage(save_area, x0, y0); 

Вы можете увидеть рабочий пример в http://jsfiddle.net/Lhmrswch/2/

+0

Хмм, это требует от меня жонглировать около 10-50 полотен. Я дам ему попробовать, хотя и посмотрю, работает ли он лучше, спасибо. – user3032989

+0

Вам нужно место для хранения сохраненных деталей. Использование отдельного холста для каждой части - это лучший подход ИМО. Если вы выполняете UNDO/REDO, командный шаблон лучше, но это еще одна история ... – 6502

+0

Закончил создание временного холста и просто изменил его размер и ввел в него секцию сохранения, а затем использовал «новое изображение() «массив, который я уже использовал. Сейчас работает отлично. – user3032989

Смежные вопросы