Обработка изображений на стороне клиента - PullRequest
32 голосов
/ 01 февраля 2010

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

Да, я знаю, желаемое за действительное

Вот информация:

  1. Обработка изображений - растеризация по некоторым данным. Подумайте, как создать изображение PNG из файла PDF.

  2. У нас мало серверной мощности. Таким образом, обработка на стороне клиента является обязательным условием.

Итак, мы рассматриваем:

  1. Flash - наиболее распространенный, но из того, что я прочитал, есть слабые инструменты разработки. (и пока нет поддержки iPhone / iPad).

  2. Silverlight - позволяет нам использовать .NET CLR, поэтому большой ++ (много кода находится в .NET). Но не поддерживается для большинства мобильных телефонов (по слухам, поддержка Android в будущем)

  3. HTML5 + Javascript - возможно, самый «переносимый» вариант. Проблема заключается в необходимости переписывать весь этот код обработки изображений в Javascript.

Какие-нибудь мысли или архитектуры, которые могут помочь? Пояснение: мне не нужны дальнейшие идеи о том, какие библиотеки доступны для Silverlight и Javascript. Моя дилемма

  • выбор Silverlight означает отсутствие поддержки большинства мобильных телефонов
  • выбор Flash означает, что мы должны переработать большую часть нашего кода И не поддерживать iPhone / iPad
  • HTML5 + Javascript, мы должны перестроить большую часть нашего кода и пока не полностью поддерживаться во всех браузерах
  • выбор двух (Silverlight + Flash) будет слишком дорогим

Какие-нибудь нестандартные или яркие идеи / альтернативы, которые я мог бы упустить?

Ответы [ 14 ]

28 голосов
/ 04 февраля 2010

Это проблема, с которой постоянно сталкиваются архитекторы программного обеспечения. Как обычно, идеального решения не существует. Вам нужно выбрать, какой компромисс наиболее приемлем для вашего бизнеса.

Подводя итог вашей проблеме, большая часть программного обеспечения для обработки изображений написана на .NET. Вы хотели бы запустить его на стороне клиента на мобильных устройствах, но проникновение .NET на мобильные телефоны ограничено. Альтернативы с более высоким уровнем проникновения (например, Flash) потребуют от вас переписать код, чего вы не можете себе позволить. Кроме того, эти альтернативы не поддерживаются на iPhone / iPad.

В идеале вам нужен способ запуска всего кода .NET на большинстве существующих платформ, включая iPhone / iPad. Я могу с уверенностью сказать, что в настоящее время такого решения не существует - нет ответа «серебряная пуля», который вы пропустили.

Так на что вам нужно идти на компромисс? Мне кажется, что даже если вы перепрограммируете во флэш-памяти, вы все равно будете упускать основной рынок (iPhone). И переработка программного обеспечения в любом случае чрезвычайно затратна.

Вот лучшее решение вашей проблемы - вам нужно пойти на компромисс в отношении ограничения «исполнения на стороне клиента». Если вы выполняете серверную часть, вы получаете возможность сохранить существующий код, а также развернуть его практически на каждом мобильном клиенте, включая iPhone.

Вы сказали, что мощность вашего сервера ограничена, но вычислительная мощность сервера низкая по сравнению с затратами на разработку программного обеспечения. На самом деле, не так уж и дорого отдавать на аутсорсинг свой серверный компонент и просто платить за то, что вы используете. Скорее всего, ваше приложение будет иметь низкое проникновение, чтобы начать с. По мере развития бизнеса вы сможете позволить себе увеличить емкость вашего сервера.

Я считаю, что это лучшее решение вашей проблемы.

7 голосов
/ 05 февраля 2010

Размещайте обработку изображений в Amazon E2C, Azure или Google. У IIRC E2C много общих проблем с обработкой изображений, и все они готовы к работе.

Azure, вероятно, более знакомо с точки зрения совместного использования кода в качестве веб-службы

Вы просто платите за циклы процессора и передачи / хранения и т. Д.

4 голосов
/ 01 февраля 2010

Некоторая помощь по части Silverlight:

Существует редактор изображений Silverlight с именем Thumba . А Нокола недавно сделал один под названием EasyPainter , и он также предоставит исходный код в будущем.

Для преобразования изображений я бы порекомендовал библиотеку с открытым исходным кодом ImageTools , которая также включает некоторые базовые эффекты. Silverlight имеет класс для управления пиксельными растровыми изображениями, называемый WriteableBitmap. Библиотека с открытым исходным кодом WriteableBitmapEx представляет собой набор методов расширения для WriteableBitmap Silverlight. API WriteableBitmap очень минималистичен, и для таких операций есть только необработанный массив Pixels. Библиотека WriteableBitmapEx пытается компенсировать это с помощью методов расширений, которые просты в использовании, как встроенные методы. Пиксельные шейдеры также можно использовать для создания быстрых и сложных эффектов. Хотя шейдеры модели 2 ограничены ими, их можно использовать для быстрого размывания, тонирования и тому подобного.

4 голосов
/ 01 февраля 2010

Я уверен, что Silverlight и JS будут публиковать примеры. Вот некоторые графические редакторы, написанные на Actionscript:

  1. Phoenix
  2. PhotoshopExpress

Для начала существует библиотека ImageProcessing . Плюс PixelBender доступен во Flash Player 10, он быстрый, работает в отдельном потоке и люди совершают с ним довольно безумные поступки.

НТН

3 голосов
/ 10 февраля 2010

Ваша проблема - идеальная цель для языка программирования Haxe . Haxe написан для Интернета и может компилироваться в JavaScript, Flash и Objective-C (возможно, в ближайшее время Java / .NET). Таким образом, вы не выбираете, в какую платформу вы собираетесь инвестировать, но на каком языке. Haxe легко адаптируется для программиста AcitonScript.

Нет смысла запускать ваши алгоритмы обработки изображений в песочнице JavaScript, когда Flash доступен, потому что это будет намного быстрее. Также нет смысла запускать сложные алгоритмы обработки изображений на мобильном устройстве, таком как iPhone, с JavaScript. Я бы поддержал только JavaScript как худшее альтернативное решение.

Если вы не любите использовать Haxe, я бы пошел с Flash. Вы также можете развернуть приложение Flash для iPhone, если это ваша проблема. Это также очень здорово, потому что вы получаете нативный код ARM. На самом деле есть отличные инструменты для профессиональной разработки Flash. FDT и IntelliJ IDEA - это два из них. Наилучшая Haxe IDE, вероятно, FlashDevelop на момент написания.

Так что я бы определенно не использовал JavaScript в качестве единственного решения. Haxe идеально подходит для того, что вы пытаетесь достичь. Если вы не доверяете или не хотите инвестировать в Haxe, вы можете использовать Flash из-за экспорта iPhone / iPad .

В зависимости от вашего варианта использования я бы также рекомендовал вам рассмотреть облачный хостинг, например, Amazon EC2 и Google AppEngine. Стоимость хостинга дешевая, а масштабирование будет легким для вашей задачи. Опыт будет намного лучше, когда речь идет о сложных операциях, которые могут занять даже много времени в настольной системе.

3 голосов
/ 10 февраля 2010

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я считаю себя сторонником платформы Flash. Я восхищаюсь огромным потенциалом Silverlight как технологии для развертывания практически любого контента .NET через браузер, но он имеет низкое проникновение, ужасно продается и, хотя многие его воспринимают (в основном люди, которые не знают ни Flash, ни Silverlight) - не является конкурентом Flash, поскольку Flash не является конкурентом Sliverlight. Мой идеалист любит идею делать все в HTML + JS, используя стандарт, а не полагаться на стороннее проприетарное программное обеспечение. Но правда в том, что JS медленен, а API ограничен, а реализации JS, HTML и CSS ужасно несовместимы во всех браузерах.

Если вы действительно хотите придерживаться .NET и так заинтересованы в нацеливании на iPhone и его братьев и сестер, то вы можете попробовать MonoTouch .

Тем не менее, хотя это может вас удивить, я скажу вам использовать Flash. :)

Почему? Бит обработки изображения - это самая маленькая часть вашего приложения. Что бы вы ни писали, я в этом уверен. Я не знаю о Silverlight, но во Flash фильтры, используемые «Thumba» и «EasyPainter», могут быть созданы в течение дня, большинство из них просто с помощью ConvolutionFilter , ColorMatrixFilter , DisplacementMapFilter и BitmapData :: paletteMap или даже просто применяя один из других фильтров, предлагаемых Flash из коробки . Любые дополнительные вещи могут быть созданы с помощью PixelBender, на что указал Джордж. Язык ядра является подмножеством C, поэтому перенос классических фильтров не должен занимать слишком много времени. Кроме того, alchemy (серверная часть LLVM, предназначенная для Flash Player 10), стоит изучить, хотя пока еще не очень стабильно.

Самая большая часть вашего приложения будет состоять из дизайна GUI, реализации GUI, бизнес-логики и т. Д. Flash действительно великолепен, когда речь идет о простых, но достаточно быстрых манипуляциях с изображениями, а благодаря инфраструктуре Flex и MXML у вас есть мощный инструмент для продуктивного создания графического интерфейса вашего приложения, который может очень хорошо взаимодействовать с множеством серверных решений практически для любой платформы.

Кроме того, Flash имеет большое и активное сообщество, предлагающее тонны учебных пособий, фрагментов кода, библиотек и сред, а также большую экосистему с инструментами кросс-компиляции для доставки флэш-контента на другие платформы (включая предстоящую Flash). CS5 или упомянутые элипсы). Я не понимаю, откуда у вас сложилось впечатление, что на платформе Flash отсутствуют инструменты разработки. Разница с пакетом .NET заключается в том, что они предоставляются множеством поставщиков. Джордж Флэш Плейер 10.1 уже указывал, но тем не менее, я хотел подчеркнуть, что это делает многие из кросс-платформенных соображений устаревшими.

И последнее, но не менее важное: я бы хотел отметить Haxe . Он позволяет компилировать как в SWF, так и в C ++, используя тот же API, который предоставляется NME , для для iPhone . Также идет работа над бэкэндом Android. Если вы не собираетесь запускать игру в течение следующих 4-5 месяцев, тогда это определенно вариант.

2 голосов
/ 10 февраля 2010

Вы можете использовать Silverlight для всех клиентов с поддержкой Silverlight, а для клиентов без Silverlight выполнять обработку на стороне сервера изображений. Поскольку код Silverlight - это C #, вы можете дважды скомпилировать его, чтобы заставить (в основном) работать с тем же кодом, что и Silverlight и не Silverlight (т.е. сервер). Это дает вам лучшее из обоих миров.

2 голосов
/ 04 февраля 2010

Помимо других ответов, другим вариантом может быть гибридное решение. Например, используйте Flash / Silverlight для большей части вашей целевой аудитории и используйте обработку на стороне сервера для тех, кто его не поддерживает (или вы можете создать собственное приложение для iP [hone | ad])

В любом случае, возможно, вам придется сделать что-то подобное, поскольку целевые мобильные телефоны могут иметь недостаточную вычислительную мощность в зависимости от сложности обработки вашего изображения.

Конечно, у вас все еще есть возможность обновить свой сервер, который, хотя в настоящее время вы получаете скидку, вероятно, намного дешевле , чем тратить время на разработку, развертывание / тестирование решения на стороне клиента. *

1 голос
/ 10 февраля 2010

Вы проверяли редактор из Pixlr.com ?
Взгляните также на их API ..

1 голос
/ 04 февраля 2010

Вы не говорите, на каком языке «весь этот код» вам придется переписывать. Может ли быть полуавтоматический перевод на Javascript практичным?

Возможно, вы могли бы начать со стороны сервера, как предлагает CraigS, и затем со временем перенести функции в клиент, вместо того, чтобы переписывать все сразу.

...