Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.03.2017, 15:18
Новичок на форуме
Отправить личное сообщение для lizard1111 Посмотреть профиль Найти все сообщения от lizard1111
 
Регистрация: 03.03.2017
Сообщений: 4

предварительная обработка графики SVG
Здравствуйте, я не сильно давно занимаюсь разработкой, прошу помощи
, направьте в нужном направлении. В общем, суть такова, необходимо реализовать фильтр, что-то типа blendmode, но нужного эффекта я не получил, реализовал через ComponentTransfer и ColorMatrix, в общем это не столь важно. Так вот нужна поддержка IE10, пришлось делать через SVG, то есть перед каждой вставкой картинки, оборачивать в <svg> а внутри еще и <image> и далее применять фильтр, т.к. ie10 filter: url к элементам не svg dom(поправьте если неправильно написал) не применяет созданный фильтр. Вопрос таков, возможно ли реализовать с помощью js предварительную обработку картинки, отфильтровать ее с помощью svg фильтров, а затем вернуть на свое место. То есть, чтобы избавиться постоянного повторения разметки. Что-то типа "загружается картинка => обрабатывается svg фильтрами => выдается как результат => вставляется обратно в место загрузки". Прошу прощение, если не столь информативно, направьте пожалуйста!
Ответить с цитированием
  #2 (permalink)  
Старый 03.03.2017, 15:27
Новичок на форуме
Отправить личное сообщение для lizard1111 Посмотреть профиль Найти все сообщения от lizard1111
 
Регистрация: 03.03.2017
Сообщений: 4

насколько я понимаю у фильтров есть атрибут с указанием источника in/in2, и если выбрать sourcegraphic то он использует для обработки картинку, которая использует ссылку на этот фильтр.(???) Так вот ie, насколько я понял, использует только картинки с объекта image svg, но не html img. это мысли вслух, поправьте пожалуйста, если неправильно понимаю
Ответить с цитированием
  #3 (permalink)  
Старый 04.03.2017, 03:20
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

lizard1111, правильно понимаешь, есть filter effects:

CSS filters - это обычное css-свойство filter, которое ты можешь использовать как другие свойства display, color, background и тд, IE10+ не поддерживает это свойство, IE9- поддерживает одноименное свойство но оно не стандартное со своим синтаксисом.

SVG filters - это обычный svg-элемент <filter>, который ты можешь использовать на других svg-элементах через их атрибут filter или на других svg/html-элементах через их css-свойство filter (если оно поддерживается), IE10+ поддерживает этот svg-элемент.

Получается что IE10+ работает только с SVG filters и без возможности ссылаться на них из стилей* через filter:url(#filter);
* в стилях svg-элементов ссылка работает, и как я понял внешний формат filters.svg#filter не работает во всех браузерах

Во избежание повтора выдели все фильтры в отдельный svg (или какой повтор ты имел ввиду? и будет ли это работать в IE10+?):
<svg width="0" height="0">
	<defs>
		<filter id="filter1">
			<feGaussianBlur in="SourceAlpha" stdDeviation="2" />
		</filter>
		<filter id="filter2">
			<feFlood result="result1" flood-color="red" />
			<feBlend in="SourceGraphic" in2="result1" mode="multiply" />
		</filter>
	</defs>
</svg>

<svg width="50" height="50">
	<image xlink:href="http://javascript.ru/cat/list/appscript.png" width="100%" height="100%" />
</svg>

<svg width="50" height="50">
	<image filter="url(#filter1)" xlink:href="http://javascript.ru/cat/list/appscript.png" width="100%" height="100%" />
</svg>

<svg width="50" height="50">
	<image filter="url(#filter2)" xlink:href="http://javascript.ru/cat/list/appscript.png" width="100%" height="100%" />
</svg>

Последний раз редактировалось Rise, 06.03.2017 в 13:21. Причина: * в стилях svg-элементов ссылка работает...
Ответить с цитированием
  #4 (permalink)  
Старый 04.03.2017, 19:17
Новичок на форуме
Отправить личное сообщение для lizard1111 Посмотреть профиль Найти все сообщения от lizard1111
 
Регистрация: 03.03.2017
Сообщений: 4

дело в том что css filter работает, но только для svg объекта. то есть через css возможно задать фильтр svg элементу, и только ему.
может быть возможно сделать что-то типа "конвейера", то есть в объекте svg сделать преобразования, а затем картинку поместить в html dom? чтобы каждый раз не оборачивать в svg? то есть у меня есть,например, 50 картинок, чтобы каждый раз не создавать разметку <svg><image>? может canvas как-то поможет, и получиться ли там реализовать, к тому же насколько я визуально помню, там можно прямо указывать источник изображения. или может есть библиотека? конечно интересно самому попробовать
Ответить с цитированием
  #5 (permalink)  
Старый 06.03.2017, 13:24
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

lizard1111, да, попробовал в IE11, оказывается так тоже работает (поправил пост):
<style>
#image1 {
	filter:url(#filter1);
}
</style>

<svg width="0" height="0">
	<defs>
		<filter id="filter1">
			<feGaussianBlur in="SourceAlpha" stdDeviation="2" />
		</filter>
		<filter id="filter2">
			<feFlood result="result1" flood-color="red" />
			<feBlend in="SourceGraphic" in2="result1" mode="multiply" />
		</filter>
	</defs>
</svg>

<svg width="50" height="50">
	<image xlink:href="http://javascript.ru/cat/list/appscript.png" width="100%" height="100%" />
</svg>

<svg width="50" height="50">
	<image id="image1" xlink:href="http://javascript.ru/cat/list/appscript.png" width="100%" height="100%" />
</svg>

<svg width="50" height="50">
	<image id="image2" style="filter:url(#filter2)" xlink:href="http://javascript.ru/cat/list/appscript.png" width="100%" height="100%" />
</svg>
Причем эта особенность нигде не отмечена не на MDN, не на CanIuse, на CanIuse есть про Edge заметка так там всё наоборот)) на MSDN (filter property, filter element) как то неявно упоминается, в итоге нашел только на IEBlog явное указание на применение:

Цитата:
A filter is applied to an SVG element via the filter attribute, in the form of filter=”url(#filterId)”, or it can be applied as a CSS property filter:url(#filterId).
-----
Canvas поможет, если источник изображения с того же сайта (same-origin), если с другого сайта (сross-origin), то только при соблюдении CORS, иначе методы извлечения данных context.getImageData(), canvas.toDataURL() будут инициировать ошибку.

Самому попробовать можно так Dynamically change images, а так уже определенные фильтры Image Filters with Canvas
Ответить с цитированием
  #6 (permalink)  
Старый 06.03.2017, 19:21
Новичок на форуме
Отправить личное сообщение для lizard1111 Посмотреть профиль Найти все сообщения от lizard1111
 
Регистрация: 03.03.2017
Сообщений: 4

спасибо, зашел сегодня написать что вопрос исчерпан, т.к. нашел такой же способ , вы первее, но все равно спасибо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание SVG элемента и вставка на страницу FINoM Events/DOM/Window 3 13.09.2015 16:47
SVG CSS, SVG to WOFF kobezzza Firefox/Mozilla 2 29.03.2013 15:59
Inline SVG as background Paguo-86PK Элементы интерфейса 0 16.12.2011 20:12
Простой графический движок: SVG vs Canvas stryaponoff Общие вопросы Javascript 5 29.06.2010 16:59
svg. обработка событий amigo* Элементы интерфейса 0 23.06.2010 22:31