LINUX.ORG.RU

pica - быстрая и качественная ресайзилка картинок для браузера

 , ,


4

1

Сорцы: https://github.com/nodeca/pica

Демка: http://nodeca.github.io/pica/demo/

Кто пытался ресайзить картинки канвасом, уже в курсе, что канвас оптимизирован на скорость и использует nearest neighbor интерполяцию. А если надо урезать осетра перед закачкой на форум, то такое качество неприемлимо. Поэтому написали свой лисапед, с которым можно поиграться по ссылкам.

Код, к сожалению, уступает С-шному по скорости, т.к. яваскрипт пока не поддерживает SIMD. Но фигачит все равно очень бодро. И точно быстрее всего что я смог найти. Ну и все это с нормальным апи и запакетировано, чтобы можно было юзать из коробки и не париться.

Из нюансов - не учитывается гамма-коррекция (RGB <-> sRGB), т.к. из канваса принципиально невозможно извлечь, чего он там нашаманил с гаммой. Но в принципе разницу заметят только профессиональные фотографы, а не любители котиков.

Пока в раздумьях, стоит ли расковыривать jpeg вручную, чтобы повысить точность до 16 бит на канал за счет гаммы.

Enjoy!

★★★★★

Последнее исправление: Vit (всего исправлений: 2)

Интересная вещь, а для каких нужд? Аватары? Просто ж в проектах где нужно хранить оригинал и превью оно не пойдёт.

ritsufag ★★★★★
()

просто спасибо!

яваскрипт пока не поддерживает SIMD

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

dib2 ★★★★★
()
Ответ на: комментарий от ritsufag

Пипл любит заливать многобегабайтных котиков как есть, а на серваке стоят лимиты типа 1600х1200. Процессить на серваке плохо - во-первых долго закачивать, во-вторых процессер жалко. Поэтому выгоднее сначала в браузере подрезать. Если не сайт фотографов, то оригиналы не нужны.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Ну это да, где не нужны оригиналы это очень хорошее решение, иначе же на превью будет котик, а в оригинале чёрный властелин и Ко.

ritsufag ★★★★★
()
Ответ на: комментарий от dib2

Ну я так и подумал, что для реалтаймовой отрисовки оно все равно не прокатит, а на аплоадах все что меньше секунды уже пофик.

Осталось только unsharp mask привернуть, но это сильно проще, чем скоростные convolution filters под ресайз запилить.

Теоретически можно слабать быстрый ресайз на WebGL, но для моих нужд и так хватает, стимула нет.

Vit ★★★★★
() автор топика

Очень-очень круто, спасибо!

На оффтопике (Windows Phone 8.1) не отрабатывает, еще подебажу на досуге. Windows 8.1 + IE11 Metro работает, что самое интересное...

noomorph
()
Последнее исправление: noomorph (всего исправлений: 1)

Спасибо, интересно.

vim
()

Это хитрый план по получению аниме картинок? (чтож ещё то лоровцы могут накидать)

anonymous
()
Ответ на: комментарий от noomorph

Навскидку только одна версия - в ишаке канвасовский getImageData() наверное возвращает обычный массив вместо типизированного (точнее, вместо clamped array), и вроде это пофиксили только в 11 версии. Какой ишак на винмобилке - не знаю. Если проблема в этом, то могу вставить проверку типа и принудительно кастовать типизированный массив. Но лучше если посмотрите и скажете точно.

Вариант с необходимостью использовать es5-shim маловероятен, т.к. если двигло браузера старое, то там и типизированный массивов с канвасами не было бы.

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

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Постараюсь помочь, конечно. Оказалось, дебаг на платформе неудобный (нужно делать через weinre). Поэтому я уже завтра подебажу (сегодня понял, что канвас действительно получается в нем пустой — то есть, отсек вариант с багом в CSS самой демки).

Если что, это воспроизводится именно в IE11 Mobile, так что не спешите вставлять проверки типов. «Вскрытие» покажет, что там не так.

noomorph
()
Последнее исправление: noomorph (всего исправлений: 1)
Ответ на: комментарий от Dron

Скоро еще будет понтовый парсер маркдауна, который не только проходит тесты CommonMark, но и легко расширяется https://github.com/jonschlinkert/remarkable . В абсолютно всех яваскриптовых пакетах, что я знаю, парсинг сделан конскими регулярками и правила приколочены гвоздями. Deffective by design.

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

Vit ★★★★★
() автор топика
Ответ на: комментарий от noomorph

Хм. Значит канвас таки пашет. Есть вариант, что вебворкеры кривые, или я не умею их готовить. https://github.com/nodeca/pica/blob/master/index.js#L103

`window.pica.WW = false` - в демковский яваскрипт попробуйте добавить, если что. Заодно это сильно упростит отладку, т.к. понять что случилось в потрохах вебворкера не реально.

Но будем надеяццо, что дело все-таки в типизированных массивах.

Vit ★★★★★
() автор топика
Ответ на: комментарий от NeverLoved

Демо уронило хром на андроиде, на стандартной картинке, при смене качества ползунком. Печалити.

Хром 37.0.2062.

И на сгенеренной картинке было '800 ms canvas' против ~13000 ms у pica. Странновато как-то.

NeverLoved ★★★★★
()
Ответ на: комментарий от NeverLoved

Хром уронить не смог, но лису получилось. Похоже, у них с памятью косяки.

Какой у вас андроид и мобилка? 13000мс это очень много. У меня на 4 нексусе 4 секунды максимум.

Vit ★★★★★
() автор топика
Последнее исправление: Vit (всего исправлений: 1)
Ответ на: комментарий от NeverLoved

Да, еще у меня программер умудрился найти обоину 14000х8000, на ней десктопный хром сложился. Ну это неудивительно - битмап там получается 450 мегабайт

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Зачем 'вы', мы же в интернете:)

Планшет Asus Memopad hd7 на Android 4.2.2.

Если скажешь где посмотреть логи и есть ли они - скину. Если нужно, конечно.

NeverLoved ★★★★★
()
Ответ на: комментарий от Vit

Я туда не аплоадил ничего, просто зашёл на демо, браузер подвис, потом отрендерились картинки (0.8 секунд и 13 секунд), а потом я опустил ползунок качества и всё.

NeverLoved ★★★★★
()

Пока в раздумьях, стоит ли расковыривать jpeg вручную, чтобы повысить точность до 16 бит на канал за счет гаммы.

https://github.com/eugeneware/jpeg-js

anonymous
()
Ответ на: Зачем 'вы', мы же в интернете:) от NeverLoved

Зачем 'вы', мы же в интернете:)

Профдеформация :) . У меня форум большой, тыкать можно не всем, а запоминать не реально. За много лет привычка выработалась.

Планшет Asus Memopad hd7 на Android 4.2.2.

MediaTek MT8125 1200 МГц. Тогда понятно откуда 13 секунд.

Vit ★★★★★
() автор топика
Ответ на: комментарий от NeverLoved

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

Vit ★★★★★
() автор топика

покрутил код, но так и не смог понять, как сделать простейшую вещь:

есть одна кнопка-ссылка, на неё нажимаешь, можно выбрать файл, и после его выбора - он отправляется. первую часть я вашим кодом сделал, за что ему большое спасибо!, а по второй - я вделал в change .submit() для формы, так оно сразу же субмитит :(

js не понимаю вообще. хотя учил его раз 20, начиная с 1998 года.

odii
()
Ответ на: комментарий от Vit

В осле вебворкеры кривые, и с канвасом есть расхождения.

Отправил pull request по поводу канваса, посмотри.

С web workers еще не фиксил, но там походу аж два фолбека чесной народ вставляет (линк на stack overflow кинул в PR).

noomorph
()
Ответ на: комментарий от noomorph

Теперь в осле тоже работает. Большое спасибо за помощь.

Если у кого будет желание дальше проект развивать - контакты на гитхабе. Я пока ограничусь добавлением unsharp mask.

Vit ★★★★★
() автор топика

Интересно. Главное результат на сервер не забирать, а то действительно, мало ли, что юзер подсунет вместо ожидаемого результата.

blexey ★★★★★
()

т.к. яваскрипт пока не поддерживает SIMD

спасибо, посмеялись

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.