Как ускорить обработку изображения в HTML5 Canvas

Все доброго времени суток, упражняюсь с CoffeeScript и HTML5 Canvas, нашел на просторах интернета алгоритм простого размытия, реализовал его на CoffeeScript, но работает очень медленно, реально картинка 500 на 500 точек обрабатывается секунд 5, на это время браузер отмирает (Safari, Chrome OSX 10.9). Есть какие-нибудь идеи ускорить этот процесс? Самому в голову пока не приходят мысли как ускорить попиксельный обход изображения. Вот код реализации размытия на CoffeeScript:
class BlurEffect extends BasicEffect
	constructor: (@_radius, @_ctx) ->

	proceed: (target) ->
		newImageData = @_ctx.createImageData(target)
		w = target.width
		h = target.height
		for i in [0...w]
			for j in [0...h]
				total = {
					red: 0
					green: 0
					blue: 0
				}
				for ky in [-@_radius...@_radius]
					for kx in [-@_radius...@_radius]
						pixel = @getPixel(target, i+kx, j+ky)
						total.red+=pixel.red
						total.green+=pixel.green
						total.blue+=pixel.blue
				newImageData.data[(j * w * 4) + (i * 4)] = total.red/ Math.pow(@_radius * 2 + 1, 2)
				newImageData.data[(j * w * 4) + (i * 4) + 1] = total.green/ Math.pow(@_radius * 2 + 1, 2)
				newImageData.data[(j * w * 4) + (i * 4) + 2] = total.blue/ Math.pow(@_radius * 2 + 1, 2)
				newImageData.data[(j * w * 4) + (i * 4) + 3] = target.data[(j * w * 4) + (i * 4) + 3]
		newImageData

Код вроде как примитивный, в пояснении не нуждается.
  • Вопрос задан
  • 3058 просмотров
Решения вопроса 1
0re1
@0re1
- не надо считать Math.pow(@_radius * 2 + 1, 2) каждый раз

- не вызывать @getPixel каждый раз, а стянуть ImageData в Typed Array

- не изпользовать объект total, а хранить именные переменные red, green, blue

- считать (j * w * 4) + (i * 4) один раз а не пять

- не использовать CoffeeScript, в for ky in [-@_radius...@_radius] будет оверхед на определения направления

- здесь может пригодиться asm-js

Мне кажется, что быстрее будет использовать CSS.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы