Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.03.2014, 03:26
Аспирант
Отправить личное сообщение для BratKilla Посмотреть профиль Найти все сообщения от BratKilla
 
Регистрация: 26.02.2014
Сообщений: 30

погрешность цвета canvas
Создана прямая в canvas с цветом rgb(15,100,100). Необходимо вычислить первую составляющую rgb, т.е. -15 .
Вычислил, но canvas размазывает это значение с 12 до 22 в зависимости от определённого пикселя на прямой.

Необходимо сократить общую погрешность одного цвета до 5 (т.е. если значение 3, то погрешность 0-5, если значение 17, то погрешность 15-20), чтобы из 255 можно было бы извлечь 50 значений. Если погрешность уберётся вообще то это идеал (т.е. 15 так и останется 15).

Есть ли такая возможность? И не опасно ли определять объекты, нарисованные в canvas по цвету в разных браузерах? насколько знаю rgb везде приветствуется... Могу, конечно, помимо R, использовать и G и B, этой совокупности хватит под задачу, но с одним R будет проще, да и знать хочу не могу)

Последний раз редактировалось BratKilla, 03.03.2014 в 03:46.
Ответить с цитированием
  #2 (permalink)  
Старый 03.03.2014, 11:18
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Очевидно что дело в сглаживании. Рисуйте прямую потолще и в центре пиксели будут именно нужного цвета. Либо отключите сглаживание canvas.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 03.03.2014, 20:25
Аспирант
Отправить личное сообщение для BratKilla Посмотреть профиль Найти все сообщения от BratKilla
 
Регистрация: 26.02.2014
Сообщений: 30

Aetae,
Да именно в сглаживании. Я хочу знать как уменьшить сглаживание или полностью его отключить. Пересмотрел все свойства и методы canvas но, ни прямого, ни косвенного способа повлиять на сглаживание не нашёл. Так же в поисковиках ответа не нашёл. Заливал одну толстую линию несколько раз сверху, но на границе всё равно погрешность до 7 шагов доходит. Суть в том что если пользователь нажмёт не в центр, а на край линии, то он получит не то значение что требуется. При использовании тач дисплеев промахнуться проще простого! У меня сложилось такое впечатление, что до полного раскрытия потенциала canvas, ещё не один год пройдёт. Слишком мало свойств и методов, для простоты работы.
Ответить с цитированием
  #4 (permalink)  
Старый 04.03.2014, 04:03
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

image-rendering: optimizeSpeed;
image-rendering: -moz-crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: optimize-contrast;
-ms-interpolation-mode: nearest-neighbor;

Но не факт что по может.
Ультимативное решение рисовать вручную прямыми линиями по координатам вида (х+0.5,y+0.5).)
__________________
29375, 35

Последний раз редактировалось Aetae, 04.03.2014 в 04:08.
Ответить с цитированием
  #5 (permalink)  
Старый 04.03.2014, 22:48
Аспирант
Отправить личное сообщение для BratKilla Посмотреть профиль Найти все сообщения от BratKilla
 
Регистрация: 26.02.2014
Сообщений: 30

Aetae,
в теории image-rendering идеальный вариант, но на практике не повлёк никаких изменений, я так понимаю такой способ новаторский для многих браузеров. Пошёл обходным путём, как писал ранее, задействовав второй элемент RGB, т.е. G. Тем самым возвёл в квадрат количество вариантов, будет мало возведу в куб) . Буду ждать полной совместимости с браузерами image-rendering
Ответить с цитированием
  #6 (permalink)  
Старый 05.03.2014, 06:15
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Нет у канваса никакого сглаживания вообще.

Не путайте с интерполяцией которой можно управлять единственно через ctx.imageSmoothingEnabled

Если вы заметили сглаживание нарисованной линии то проверьте shadow в своих кодах либо в кодах либы которая услужливо сглаживает.

И последний, неколебимый вариант - браузер гадит. Тут либо искать браузерный контекст, либо забить.

Забить так: в пиксельных операциях всегда применяется порог - threshold - с помощью которого и определяется что красное, что черное, что белое и так далее.

Цитата:
но canvas размазывает это значение с 12 до 22
Не заливайте канвас цветом. Пресловутое сглаживание формируется в альфе, которая затем умножается на цвет пикселов фона, а если фона нет, умножаться не на что.
Ответить с цитированием
  #7 (permalink)  
Старый 05.03.2014, 07:12
Аспирант
Отправить личное сообщение для BratKilla Посмотреть профиль Найти все сообщения от BratKilla
 
Регистрация: 26.02.2014
Сообщений: 30

kostyanet,
если я в canvas рисую линию любой толщиной, то по краям, ближайшие к фону пиксели имеют не тот цвет, что я задавал в свойстве. Как сделать монотонной линию на всей занятой ею поверхности?

imageSmoothingEnabled = false;
mozImageSmoothingEnabled = false;
oImageSmoothingEnabled = false;
webkitImageSmoothingEnabled = false;

Не помогли. Вообще ни каких результатов. В canvas только линии (не пересекаются), нет фона (не заливал), нет shadow, и вообще всего по минимуму. Если знаете просто напишите как решить данную проблему, пожалуйста!

Последний раз редактировалось BratKilla, 05.03.2014 в 07:20.
Ответить с цитированием
  #8 (permalink)  
Старый 05.03.2014, 13:33
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Я же написал что метод интерполяции и сглаживание не одно и то же.

Еще раз

http://stackoverflow.com/questions/4...-anti-aliasing

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

Рисуйте сами, через дату. Однако надо понимать что вы там делаете, а что вы там делаете непонятно.

Сообщение от BratKilla
Суть в том что если пользователь нажмёт не в центр, а на край линии
Пользователь "нажимает" на линию и вы хотите узнать на какую? Приготовьтесь к введению порога. Вместо 16 млн цветов разрешите себе 256, или 512 - сколько вас устроит - и ориентируйтесь не на равенство, а на диапазон. Диапазон тем самым порогом и задается.

И еще вот какая штука - размер сэмпла. Сколько он у вас применительно к тачу пальцем? Ни за что не поверю что 1Х1 как у мыши. Даже со стилусом 1Х1 не имеет смысла.

И последнее. Вертикальные и горизонтальные линии надеюсь без сглаживания получаются?

Потому что если и они расплываются, значит у вас позиционирование не попадает в пиксельную сетку.
Ответить с цитированием
  #9 (permalink)  
Старый 05.03.2014, 13:41
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Из примера выше.

context.moveTo(0,0); 
context.lineTo(100,75);
context.strokeStyle = "#df4b26";
context.lineWidth = 3;


Если эквидистанта располагается по центру заданного пути, то ежу ж понятно слева от него 1.5 пиксела, справа от него 1.5 пиксела. Смотрите на иллюстрации. Это в ФШ сделано, но принцип фундаментален.

Без сглаживания обводка в 3 пиксела невозможна. Если вы ничтоже сумняще так же поступаете как автор цитаты, то попробуйте для начала задать толщину линии кратную 2. Чтобы и слева и справа было одинаково. Или ищите опции расположения эквидистанты - снаружи, или внутри.

Синим на картинке показана та же обводка, но в 4 пиксела.

Вертикальные и горизонтальные линии пикселы которых уложены в сетку никогда не сглаживаются. У вас так?
Изображения:
Тип файла: jpg stroke.jpg (5.3 Кб, 3 просмотров)

Последний раз редактировалось kostyanet, 05.03.2014 в 13:47.
Ответить с цитированием
  #10 (permalink)  
Старый 05.03.2014, 14:00
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

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

Последний раз редактировалось kostyanet, 05.03.2014 в 14:03.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение площади нарисованного Canvas пространства BratKilla Элементы интерфейса 5 26.02.2014 07:15
Canvas картинка с обесцвечиванием. cheba Общие вопросы Javascript 9 31.05.2013 09:13
Создание экземпляра Canvas не затрагивая HTML Tails Общие вопросы Javascript 2 09.03.2012 13:55
Canvas замена цвета области, ограниченной другим цветом Nickolac Элементы интерфейса 3 26.03.2011 16:20
Добавить на canvas еще один елемент greengarlic Общие вопросы Javascript 5 22.09.2010 10:16