Получилось сделать хорошую скорость: сейчас алгоритм примерно такой:
изначальная картинка жмётся через drawImage до максимально допустимого размера, а затем жмётся в неск потоков с помощью алгоритма Ланцоша.
http://screencast.com/t/QfD57flZmvE
(1 - оригинальная картинка, drawImage, алгоритм Ланцоша)
Как видно, что при сильном уменьшении картинок через drawImage детали создают слишком высокую резкость, а во втором варианте происходит дополнительное сглаживание пикселей за счёт чего картинка выглядит лучше (степень сглаживания линейно влияет на скорость работы и её можно менять).
Завтра, как всё доделаю, могу выложить код, если кому нужно