С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 17
1

Определение границ заливки изображения

25.01.2015, 08:55. Показов 2691. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Подскажите, как можно определить границы рисунка для последующей работы с ними?
например, есть изображение с прозрачным фоном и его нужно обвести по контуру ( по границе с этой самой прозрачностью) на canvas и создать area.
надеюсь понятно написал, если нет, то задавайте необходимые вопросы -отвечу.
интересует предпочтительно решение на JS, но если есть иные - тоже предлагайте, буду рад всему.
Спасибо
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.01.2015, 08:55
Ответы с готовыми решениями:

Определение позиции div'a относительно границ монитора
когда прокручиваем сайт, можно ли определить с помощью jquery находиться ли блок в приделе...

Ошибка заливки изображения
Добрый день! Столкнулся с такой проблемой. При заливке изображения в mathcad появляется ошибка (см...

Сдвиг изображения после выполнения заливки региона окна
День добрый, Есть ситуация, когда в окне создается псевдо-кнопка, через CreateRectRgn, а потом...

Скрипт заливки изображения на хостинг + получения данных с него
Есть скрипт редактирования скинов minecraft( Игра на java). После редактирования скина происходит...

6
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
25.01.2015, 16:37 2
danian, на canvas каждый пиксель имеет свой цвет в формате rgba. Получить его можно с помощью метода getImageData (возвращает сразу все пиксели). Вот отсюда и можно решать, какой пиксель какого цвета. К примеру если пиксель имеет какой то цвет, а рядом есть прозрачные пиксели, значит они являются границей... Но для этого придется канву изначально делать прозрачной. И мне кажется, слишком тяжелые расчеты будут. Может есть другие методы.
1
388 / 275 / 76
Регистрация: 19.09.2011
Сообщений: 828
26.01.2015, 22:12 3
у меня на флешах есть готовое.

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

там код вида
ActionScript 3
1
2
3
4
5
6
7
8
9
10
stepIndex = stepIndex + 2 & 7;
stepX = steps[stepIndex];
stepY = steps[stepIndex + 1 | 0];
if (pixs[(y + stepY) * width + x + stepX | 0] === WHITE) {
    stepIndex = stepIndex + 6 & 7;
    stepX = steps[stepIndex];
    stepY = steps[stepIndex + 1 | 0];
}else {
    pols[pols.length - 1 | 0].push(new Point(x, y));
}
и нужно время что бы переписать на js, если не надо скажи сразу
Миниатюры
Определение границ заливки изображения  
Вложения
Тип файла: swf asd.swf (2.9 Кб, 5 просмотров)
1
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 17
27.01.2015, 12:38  [ТС] 4
нет, дружище, это не совсем то, но спасибо.
координаты границ я думаю вытащить методом getImageData, как и писалось выше.
останется только сократить количество точек через подобные(об этом подумаю, если у кого есть предложения - высказывайте), но пока нет времени на это
0
388 / 275 / 76
Регистрация: 19.09.2011
Сообщений: 828
27.01.2015, 13:00 5
danian, в смысле не то? есть какие то другие границы и другая прозрачность?

тебе нужно сделать что бы прозрачные области на картинке не кликались? и для этого ты хочешь юзать area?
0
0 / 0 / 0
Регистрация: 08.12.2013
Сообщений: 17
28.01.2015, 08:48  [ТС] 6
Цитата Сообщение от nubideus Посмотреть сообщение
danian, в смысле не то? есть какие то другие границы и другая прозрачность?

тебе нужно сделать что бы прозрачные области на картинке не кликались? и для этого ты хочешь юзать area?
ну или я не совсем понял твое предложение. да, про area верно
0
388 / 275 / 76
Регистрация: 19.09.2011
Сообщений: 828
03.02.2015, 13:38 7
Лучший ответ Сообщение было отмечено danian как решение

Решение

http://jsbin.com/dukiwehalu/4

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
var getPolygons = function(image){
  var buffer = document.createElement("canvas").getContext("2d");
  buffer.canvas.width = image.width + 2;
  buffer.canvas.height = image.height + 2;
  
  buffer.save();
  buffer.fillStyle = "white";
  buffer.fillRect(0, 0, buffer.canvas.width, buffer.canvas.height);
  buffer.globalCompositeOperation = "destination-in";
  buffer.drawImage(image, 1, 1);
  buffer.restore();
  
  var data = buffer.getImageData(0, 0, buffer.canvas.width, buffer.canvas.height);
  var pixs = data.data;
  var pols = [];
  var steps = [
     0, -1,
     1,  0,
     0,  1,
    -1,  0,
  ];
  var walls = [
     1,  0,
     1,  1,
     0,  1,
     0,  0,
  ];
 
  var WHITE = 0xFFFFFFFF | 0;
  var BLACK = 0x00000000 | 0;
  var RED = 0xFFF00000 | 0;
  var SUBRED = 0x000F0000 | 0;
 
  var width = data.width;
  var len = data.width * data.height * 4;
 
  var inOpen = false;
  var outOpen = false;
  for (var i = 0; i < len; i += 4) {
    // noprotect
    var pix = (pixs[i] << 24) | (pixs[i + 1] << 16) | (pixs[i + 2] << 8) | (pixs[i + 3]);
    if (pix === SUBRED) {
      outOpen = true;
      inOpen = false;
    } else if (pix >>> 24 === 0) {
      outOpen = false;
      inOpen = false;
    } else {
      if (pix === RED){
        inOpen = true;
      }
      
      if (outOpen && inOpen) {
        continue;
      }
      outOpen = true;
      inOpen = true;
      var startX = (i >> 2) % width - 1;
      var startY = (i >> 2) / width | 0;
      var x = startX;
      var y = startY;
 
      pols.push([]);
 
      var stepIndex = 0;
      var stepX = steps[stepIndex];
      var stepY = steps[stepIndex + 1];
 
      for(;;) {
        x = x + stepX;
        y = y + stepY;
        if (pixs[(y * width + x) << 2]) {
          pixs.set([0xFF, 0xF0, 0, 0], (y * width + x) << 2);
          x = x - stepX;
          y = y - stepY;
          pixs.set([0, 0x0F, 0, 0], (y * width + x) << 2);
 
          pols[pols.length - 1].push(new Point(x + walls[stepIndex], y + walls[stepIndex + 1]));
 
          stepIndex = stepIndex + 6 & 7;
          stepX = steps[stepIndex];
          stepY = steps[stepIndex + 1];
        }else if (pixs[((y + stepX) * width + x - stepY) << 2]) {
          pixs.set([0xFF, 0xF0, 0, 0], ((y + stepX) * width + x - stepY) << 2);
          pixs.set([0, 0x0F, 0, 0], (y * width + x) << 2);
        }else {
          stepIndex = stepIndex + 2 & 7;
          stepX = steps[stepIndex];
          stepY = steps[stepIndex + 1];
          pols[pols.length - 1].push(new Point(x + walls[stepIndex], y + walls[stepIndex + 1]));
        }
        if (stepIndex === 0 && x === startX && y === startY) {
          break;
        }
      }
    }
  }
  
  for (i = 0; i < pols.length; i++ ) {
    var pol = pols[i];
    if (pol[0].x > pol[1].x && pol[0].y === pol[1].y) {
      var j = i - 1;
      for (; j >= 0; j-- ) {
        var isin = rectangleInOrthogonalPolygon(new Rectangle(pol[0].x + 0.5, pol[0].y + 0.5, 0, 0), pols[j]);
 
        if (isin !== -1) {
          pols.splice(pols.indexOf(pol), 1);
 
          var resPol = pols[j];
          var controlPoint = resPol[isin + 1];
 
          var newPol = [];// (pol.length + resPol.length + 2);
 
          var resPolIndex = 0;
          while (resPolIndex <= isin) {
            newPol.push(resPol[resPolIndex++]);
          }
          newPol.push(new Point(pol[0].x, controlPoint.y));
          for (var polIndex = 0; polIndex < pol.length; polIndex++ ) {
            newPol.push(pol[polIndex]);
          }
          newPol.push(new Point(pol[0].x, controlPoint.y));
          while (resPolIndex < resPol.length) {
            newPol.push(resPol[resPolIndex++]);
          }
          pols[j] = newPol;
          i--;
        }
      }
    }
  }
  pols.forEach(function(pol){
    pol.forEach(function(v){
      v.x -= 1;
      v.y -= 1;
    });
  });
  return pols;
};
 
var rectangleInOrthogonalPolygon = function(rect, pol) {
  var counter = 0;
  var result = -1;
  
  for (var vertexIndex = 0; vertexIndex < pol.length; vertexIndex++ ) {
    var s = pol[vertexIndex]; // s - start of line
    var e = pol[(vertexIndex + 1) % pol.length]; // e - end of line
    
    if (s.x > e.x) {
      s = e;
      e = pol[vertexIndex];
    }
    
    if (s.x <= rect.x + rect.width && rect.x <= e.x) {
      if (s.y > e.y) {
        s = e;
        e = pol[vertexIndex];
      }
      if (s.y <= rect.y + rect.height && rect.y <= e.y) {
        result = vertexIndex;
        return result;
      }else if (s.x !== e.x && rect.y > s.y && rect.x > s.x && rect.x <= e.x) {
        if (result !== -1 && Math.abs(rect.y - pol[result].y) > Math.abs(rect.y - e.y)) {
          result = vertexIndex;
        }
        if (result === -1) {
          result = vertexIndex;
        }
        counter++;
      }
    }
  }
  if (counter % 2) {
    return result;
  }else {
    result = -1;
  }
  
  return result;
};
на выходе ортогональный полигон.
оптимизируй этим http://habrahabr.ru/post/137852/
1
03.02.2015, 13:38
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2015, 13:38
Помогаю со студенческими работами здесь

Определение границ
2.определение границ y=x5-x3-x+2 х

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

Определение границ цифр
Здравствуйте, подскажите, как можно определить границы цифр, по которым можно резать? Я пытался...

Определение границ типов данных
Задача такова. Требуется определить максимальные границы для основных типов данных, т.е. int,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru